QTextEdit中的文本格式很好,就像Qt Creator一样

时间:2013-10-07 19:22:35

标签: qt

Qt Creator发现一个很好的格式化操作,在一些文本周围绘制一个薄框(这里的一个例子,我指的是addRow周围的框架,黄色区域是一个文本查找操作的结果,也是框架的位置发现,在我移动光标之前..)

Enter image description here

我一直无法找到如何在QTextEdit中获得该效果。我试图从Qt Creator来源读取,但它们对于不知情的搜索来说太大了......

修改

我刚刚开始通过

查看自定义QTextCharAttribute
class framedTextAttr : public QTextObjectInterface {...}

修改

它的工作原理:按照下面的my answer

5 个答案:

答案 0 :(得分:9)

使用QTextEdit::setExtraSelections()突出显示文档的任意部分。 QTextEdit::ExtraSelection class是带有公共成员变量的简单类,用于定义每个突出显示。要创建突出显示,

  1. QTextCursor
  2. 获取QTextEdit
  3. 操纵光标,使其包含正确的文本作为选择
  4. 将光标和所需的QTextCharFormat存储在ExtraSelections对象中(只需分配值,无需指针或new
  5. ExtraSelections对象(作为值)存储在QList
  6. 重复以上所有您想要的亮点
  7. 调用setExtraSelections()方法
  8. 一些示例代码:

    #include <QtGui>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        // create QTextEdit, with lot of text in it
        QTextEdit w("Alice and Bob (and Eve). ");
        for(int i=0;i<10;++i) w.setText(w.toPlainText() + w.toPlainText());
    
        // prepare variables for highlights
        QTextCharFormat fmt;
        fmt.setUnderlineStyle(QTextCharFormat::SingleUnderline);
        fmt.setUnderlineColor(QColor(200,200,200));
        fmt.setBackground(QBrush(QColor(230,230,230)));
    
        // highlight all text in parenthesis
        QTextCursor cursor = w.textCursor();
        while( !(cursor = w.document()->find(QRegExp("\\([^)]*\\)"), cursor)).isNull()) {
            QTextEdit::ExtraSelection sel = { cursor, fmt };
            selections.append(sel);
        }
    
        // set, show, go!
        w.setExtraSelections(selections);
        w.show();
        return a.exec();
    }
    

答案 1 :(得分:6)

使用QTextObjectInterface我得到文本对象周围的框架:

QSizeF framedTextAttr::intrinsicSize(QTextDocument *doc, int posInDocument, const QTextFormat &format)
{
    Q_ASSERT(format.type() == format.CharFormat);
    const QTextCharFormat &tf = *(const QTextCharFormat*)(&format);
    QString s = format.property(prop()).toString();
    QFont fn = tf.font();
    QFontMetrics fm(fn);
    return fm.boundingRect(s).size();
}

void framedTextAttr::drawObject(QPainter *painter, const QRectF &rect, QTextDocument *doc, int posInDocument, const QTextFormat &format)
{
    Q_ASSERT(format.type() == format.CharFormat);
    QString s = format.property(prop()).toString();
    painter->drawText(rect, s);
    painter->drawRoundedRect(rect, 2, 2);
}

但是文本变成了单个对象,不再是可编辑的

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setCentralWidget(new QTextEdit);

    framedTextAttr *fa = new framedTextAttr;
    editor()->document()->documentLayout()->registerHandler(framedTextAttr::type(), fa);

    editor()->setPlainText("hic sunt\n leones !");

    QTextCharFormat f;
    f.setObjectType(fa->type());

    QTextCursor c = editor()->document()->find("leones");
    f.setProperty(fa->prop(), c.selectedText());

    c.insertText(QString(QChar::ObjectReplacementCharacter), f);
}

结果(这里是图片):

Enter image description here

似乎很难概括。我不满意......

修改

实际上,这是可行的。 我已经用插图方法解决了一些问题,并且对于可重复使用的折叠/展开文本似乎也是可行的。

Enter image description here

我放了my test project on GitHub

答案 2 :(得分:0)

好吧,使用像Qt Creator这样的大型项目的部分代码并不容易,而且从头开始创建自己的代码需要花费更多的时间和精力。

对于你的问题,Qt有一个很酷的类QSyntaxHighlighter你可以继承并将你的语法模式设置为正则表达式和规则(颜色,字体粗细......)

因此,对于您的情况,您需要在用户在查找框中键入或选择单词时动态设置语法模式,对于语法规则,它将是背景颜色。

答案 3 :(得分:0)

是否要求使用QTextEdit?如果没有,您可以使用Scintilla作为文本编辑组件,它具有Qt绑定。 Scintilla具有Indicator功能,可以完全满足您的需求。

答案 4 :(得分:0)

您可以查看Qt Code的syntaxhighlighter示例。我猜它会很有用。