前言
最近为便利贴小工具新增点击链接,然后自动在浏览器中打开,这样一个功能。最开始想的是只要在输入内容时自动识别链接,然后在fromat中将其设置为链接格式,QTextEdit应该会自动处理。而事实是QT并没有做到这一点所以只能自己实现这么一个功能。
功能
简单的实现鼠标点击QTextEdit中的链接,系统上的浏览器会自动访问。但是这里的点击会与QTextEdit中的插入冲突,所以要修改链接时,只能通过键盘的上下左右键,将光标移动到链接中需要修改的位置(这个似乎没有更好的解决办法)。
实现思路
在QTextEdit中,鼠标点击会将光标移动到点击的文本位置,所以可以在鼠标点击事件中实现这样的操作
- 获取当前光标的位置
- 获取当前光标所在的文本块
- 使用正则匹配文本块中所有的链接
- 检测链接的位置,是否位于某个链接中,如果是则打开链接,否则不做操作
代码
void TextEditOpenURL::mousePressEvent(QMouseEvent* e)
{
QTextEdit::mousePressEvent(e);
if (e->button() != Qt::LeftButton)
return;
QRegExp urlRex = QRegExp("(http|ftp|https):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?");
//获取光标所在的位置
QTextCursor cursor = textCursor();
QString str = cursor.block().text();
int blockPos = cursor.positionInBlock();
//匹配正则,如果光标所在位置是一个链接,那么直接打开
int pos = 0;
int length = 0;
while ((pos = urlRex.indexIn(str, pos)) != -1) {
length = urlRex.matchedLength();
if (blockPos - pos < length)
{
auto temp = str.mid(pos, length - 1);
QUrl url(temp);
QDesktopServices::openUrl(QUrl(url));
break;
}
pos += urlRex.matchedLength();
}
}
只需要重写鼠标点击事件,然后在鼠标点击事件中实现功能即可。

这是效果图。
注意:如何识别网址链接与正则表达式有关,如果想修改识别模式直接修改正则表达式即可。这个代码直接放到鼠标点击事件中,就可以使用。
总结
这种实现方式缺陷很明显,因为这个操作在UI上没有给出任何的提示,很难让人知道还有这么一个功能。
本来在构想时是打算在鼠标移动时判断鼠标下方的字符串是否为链接,然后将鼠标光标显示为可点击状态,悬停时显示一个tooltip 来提示用户点击的。不过没有在帮助文档中找到合适的接口来实现这一功能。
文章评论