问题
由于需要, 在 QTextEdit 中需要对有文件路径的行, 在鼠标移动到路径上方时改变鼠标形状, 双击文件路径可以调用系统默认程序打开该文件.
这里有两个要点:
- 打开鼠标踪
setMouseTracking(true)
- 获取鼠标下的行文本
实现
通过重载 void mouseMoveEvent(QMouseEvent *e)
来捕获鼠标事件, 具体代码如下
// 行文本形式如下
// <<word 文档标题>> [word 文档路径] 段落序号
/*
*/
void DzfContentEdit::mouseMoveEvent(QMouseEvent *e)
{
QTextEdit::mouseMoveEvent(e);
// 得到鼠标下行文本
auto pos = e->pos();
auto cursor = cursorForPosition(pos);
cursor.select(QTextCursor::LineUnderCursor);
auto line = cursor.selectedText();
QRegExp reg("\\[(.*docx?)\\]");
if(reg.indexIn(line) != -1){
// 得到文件路径
doc_ = reg.capturedTexts().at(1);
// 若在指定行上, 改变鼠标形状
viewport()->setCursor(Qt::PointingHandCursor);
}else{
doc_.clear();
// 若不在指定行上, 恢复鼠标形状
viewport()->setCursor(Qt::IBeamCursor);
}
}
/*
*/
void DzfContentEdit::mouseDoubleClickEvent(QMouseEvent *e)
{
if(!doc_.isEmpty()){
// 文件路径前不加上 "file:///", 路径中含中文字符时出现乱码
doc_.prepend("file:///");
// 打开文件
QDesktopServices::openUrl(QUrl(doc_));
}else{
QTextEdit::mouseDoubleClickEvent(e);
}
}
最后
对于指定行的文本格式, 最好是鼠标在路径上方时才变为手形形状. 当前实现是在整行都会变为手形鼠标形状.
若有高手知道如何实现, 还请告知~~