16

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

在此处输入图像描述

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

编辑

我刚刚开始研究自定义 QTextCharAttribute,通过

class framedTextAttr : public QTextObjectInterface {...}

编辑

它正在工作:根据我在下面的回答

4

5 回答 5

12

用于QTextEdit::setExtraSelections()突出显示文档的任意部分。QTextEdit::ExtraSelection是具有公共成员变量的简单类,用于定义每个突出显示。打造亮点,

  1. QTextCursor从得到QTextEdit
  2. 操纵光标,使其包含正确的文本作为选择
  3. 将光标和期望存储QTextCharFormatExtraSelections对象中(只需分配值,不需要指针或new
  4. ExtraSelections对象(作为值)存储在QList
  5. 重复以上所有你想要的亮点
  6. 调用setExtraSelections()方法

一些示例代码:

#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();
}
于 2013-10-16T13:27:47.227 回答
7

使用 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);
}

结果(这里是图片):

在此处输入图像描述

似乎很难一概而论。我不满意...

编辑

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

在此处输入图像描述

我已经把我的测试项目放在了 GitHub 上

于 2013-10-17T11:32:51.473 回答
1

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

于 2013-10-17T11:44:12.877 回答
0

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

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

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

于 2013-10-08T09:40:33.140 回答
0

您可以查看 Qt 代码的 syntaxhighlighter 示例。我想它会很有用。

于 2014-03-29T10:03:05.233 回答