sav*_*i ᯓ 3 c++ user-interface qt
QTextEdit 可以简单地使用append() 来附加文本。但是,如果文档是富文本,则每次附加到文档时,它显然都会被重新解析。这在 Qt 中似乎有点陷阱。
如果您将编辑框用作日志窗口,并由于外部信号而快速连续追加文本,则追加操作可能会轻松挂起您的应用程序,并且不会显示任何中间追加,直到每个追加完成为止。
如何将富文本附加到 QTextEdit 而不降低整个 UI 的速度?
如果您希望每个附加实际上快速且单独显示(而不是等到它们全部附加后才显示),您需要访问内部 QTextDocument:
void fastAppend(QString message,QTextEdit *editWidget)
{
const bool atBottom = editWidget->verticalScrollBar()->value() == editWidget->verticalScrollBar()->maximum();
QTextDocument* doc = editWidget->document();
QTextCursor cursor(doc);
cursor.movePosition(QTextCursor::End);
cursor.beginEditBlock();
cursor.insertBlock();
cursor.insertHtml(message);
cursor.endEditBlock();
//scroll scrollarea to bottom if it was at bottom when we started
//(we don't want to force scrolling to bottom if user is looking at a
//higher position)
if (atBottom) {
scrollLogToBottom(editWidget);
}
}
void scrollLogToBottom(QTextEdit *editWidget)
{
QScrollBar* bar = editWidget->verticalScrollBar();
bar->setValue(bar->maximum());
}
Run Code Online (Sandbox Code Playgroud)
滚动到底部是可选的,但在日志记录中使用它是 UI 行为的合理默认值。
另外,如果您的应用程序同时进行大量其他处理,则将其附加到 fastAppend 末尾,将优先考虑尽快显示消息:
//show the message in output right away by triggering event loop
QCoreApplication::processEvents();
Run Code Online (Sandbox Code Playgroud)
这实际上看起来是Qt 中的一种陷阱。我想知道为什么 QTextEdit 中没有直接使用 fastAppend 方法?或者这个解决方案有什么注意事项吗?
(我的公司实际上向 KDAB 支付了这个建议,但这看起来很愚蠢,我认为这应该是更常见的知识。)
归档时间: |
|
查看次数: |
2088 次 |
最近记录: |