Qt Creator发现一个很好的格式化操作,在一些文本周围绘制一个薄框(这里的一个例子,我指的是addRow周围的框架,黄色区域是一个文本查找操作的结果,也是框架的位置发现,在我移动光标之前..)
我一直无法找到如何在QTextEdit中获得该效果。我试图从Qt Creator来源读取,但它们对于不知情的搜索来说太大了......
修改的
我刚刚开始通过
查看自定义QTextCharAttributeclass framedTextAttr : public QTextObjectInterface {...}
修改的
它的工作原理:按照下面的my answer。
答案 0 :(得分:9)
使用QTextEdit::setExtraSelections()
突出显示文档的任意部分。 QTextEdit::ExtraSelection class是带有公共成员变量的简单类,用于定义每个突出显示。要创建突出显示,
QTextCursor
QTextEdit
QTextCharFormat
存储在ExtraSelections
对象中(只需分配值,无需指针或new
)ExtraSelections
对象(作为值)存储在QList
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();
}
答案 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);
}
结果(这里是图片):
似乎很难概括。我不满意......
修改的
实际上,这是可行的。 我已经用插图方法解决了一些问题,并且对于可重复使用的折叠/展开文本似乎也是可行的。
答案 2 :(得分:0)
好吧,使用像Qt Creator这样的大型项目的部分代码并不容易,而且从头开始创建自己的代码需要花费更多的时间和精力。
对于你的问题,Qt有一个很酷的类QSyntaxHighlighter
你可以继承并将你的语法模式设置为正则表达式和规则(颜色,字体粗细......)
因此,对于您的情况,您需要在用户在查找框中键入或选择单词时动态设置语法模式,对于语法规则,它将是背景颜色。
答案 3 :(得分:0)
答案 4 :(得分:0)
您可以查看Qt Code的syntaxhighlighter示例。我猜它会很有用。