我的 Qt 应用程序中有一个控制台窗口,它的输出窗口是一个专门的 QTextEdit,输出从 QLineEdit 解析并随后执行的命令后处理的消息通过主程序。该窗口可以输出正常消息、警告,如果需要,还可以输出 6 种不同自定义颜色的文本。所有 8 种不同类型的文本都由类型为 QColor 的 8 种不同QProperties 定义了它们的颜色;这些颜色与输出窗口样式的其余部分一起通过使用加载时应用于 QApplication 的 QSS 文件。要以某种颜色书写文本,在插入文本之前在 QTextEdit 上调用 setTextColor。 (顺便说一句,当在 QTextEdit 上调用时,moveCursor 似乎将要插入的文本的颜色重置为默认颜色,而不管它之前的设置是什么,但是我确保在调用 moveCursor 之后和调用 insertPlainText 之前立即设置所需的文本颜色。)
我遇到的问题是,似乎(据我所知)通过 qApp->setStyleSheet 应用的样式在处理消息队列之前并未实际应用。当程序启动时,它应用样式表,不久之后,一条硬编码的测试消息被发送到控制台窗口,显示上次编译的日期和时间。此消息最终以原始 QTextEdit 颜色(黑色)打印,在应用样式表中的黑色背景颜色后,该颜色不可见。问题并不像应用样式时设置控制台窗口的标准文本颜色那么简单,因为在样式生效之前,可能会向控制台窗口发送任意数量的消息,从而导致任意数量的不同颜色的消息。
我正在想办法解决这个问题。目前我能想到的最好方法是标记方法,其中消息将包含在语义标记中(例如,所有警告消息将包含在类似 HTML 的标记中以指定它们是警告),并且当控制台窗口的样式应用后,每条消息都将根据新样式重新着色。这显然需要挂接到 QTextEdit 的某些“OnStyleApplied”事件。这是否可能,或者是否有更好的方法来解决这个问题?
最佳答案
如果它真的在消息队列中应用 qstylesheet 更改,请告诉消息队列在您下次调用之前进行处理。
http://qt-project.org/doc/qt-5.0/qtcore/qcoreapplication.html#processEvents
您甚至可以指定应处理的事件类别。
另一种可行的方法是,您可以专门告诉小部件在需要时应用其样式更改。
前几天我用 qstylesheets 深入研究了一些高级的东西:
注意 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 类调试字符串表示的自动呈现的所有细节。
希望对您有所帮助。
关于css - Qt 样式表不会立即应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19916354/