1

我的 Qt 应用程序中有一个控制台窗口,其输出窗口是专门的QTextEdit ,输出在从QLineEdit解析命令并随后由主程序执行后处理的消息。该窗口可以以 6 种不同的自定义颜色输出正常消息、警告和(如果需要)文本。所有 8 种不同类型的文本都有它们的颜色,由 8 个QColor类型的不同QProperties定义这些是通过在加载时应用到QApplication的 QSS 文件与输出窗口的其余样式一起设置的。要以某种颜色编写文本,请在QTextEdit上调用setTextColor就在插入文本之前。(顺便说一句,在QTextEdit上调用moveCursor似乎会将要插入的文本的颜色重置为默认颜色,而不管它之前设置了什么,但我确保在调用后立即设置所需的文本颜色moveCursor和调用insertPlainText 之前。

我遇到的问题是(据我所知)通过qApp->setStyleSheet应用的样式在处理消息队列之前实际上并没有应用。当程序启动时,它会应用样式表,然后很快就会将硬编码的测试消息发送到控制台窗口,显示上次编译的日期和时间。此消息最终打印在原始QTextEdit中颜色(黑色),在样式表中应用黑色背景色后不可见。问题并不像在应用样式时设置控制台窗口的标准文本颜色那么简单,因为在样式生效之前可能会向控制台窗口发送任意数量的消息,从而导致任意数量的不同颜色的消息。

我试图想出解决这个问题的最佳方法。目前我能想到的最好方法是一种标记方法,其中消息将包含在语义标签中(例如,所有警告消息都将包含在类似 HTML 的标签中以指定它们是警告),以及当控制台窗口的样式应用每条消息将根据新样式重新着色。这显然需要挂钩到QTextEdit 的一些“OnStyleApplied”事件。这是可能的,还是有更好的方法来解决这个问题?

4

1 回答 1

2

如果它真的在消息队列中应用 qstylesheet 更改,请告诉消息队列在下一次调用之前得到处理。

http://qt-project.org/doc/qt-5.0/qtcore/qcoreapplication.html#processEvents

您甚至可以指定应处理的事件类别。

应该工作的另一种方式是,您可以明确告诉小部件在需要时应用其样式更改。

前几天我用 qstylesheets 深入研究了一些高级的东西:

QList:内存不足

注意上面链接中polish和的使用。unpolish

但除了所有直接答案之外,您可能还想研究使用为富文本编辑而设计的类:

http://qt-project.org/doc/qt-5.0/qtgui/richtext.html

结构经过深思熟虑,您可以使用它们做很多事情。弄清楚它们有一个学习曲线,但效果很好。

这个和你说的有点关系。。。

这里还有一个 Qt 拥有的简洁工具:

http://qt-project.org/doc/qt-5.0/qtcore/qtglobal.html#qInstallMessageHandler

当您将它与 结合使用<some text editor/viewer class qt has>.append();时,当您想要添加文本时,您只需使用该qDebug() <<调用,您就会获得插入空格、换行符和许多 Qt 类调试字符串表示的自动呈现的所有细节。

希望有帮助。

于 2013-11-12T04:03:37.103 回答