QTextEdit 特定行改变鼠标形状

问题

由于需要, 在 QTextEdit 中需要对有文件路径的行, 在鼠标移动到路径上方时改变鼠标形状, 双击文件路径可以调用系统默认程序打开该文件.

这里有两个要点:

  • 打开鼠标踪 setMouseTracking(true)
  • 获取鼠标下的行文本

实现

通过重载 void mouseMoveEvent(QMouseEvent *e) 来捕获鼠标事件, 具体代码如下

// 行文本形式如下
// <> [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);
    }
}

最后

对于指定行的文本格式, 最好是鼠标在路径上方时才变为手形形状. 当前实现是在整行都会变为手形鼠标形状.

若有高手知道如何实现, 还请告知~~

你可能感兴趣的:(QT)