【问题标题】:Qt style sheets are not applied immediatelyQt 样式表不会立即应用
【发布时间】:2013-11-11 21:31:26
【问题描述】:

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

之前立即设置所需的文本颜色

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

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

【问题讨论】:

    标签: css qt


    【解决方案1】:

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

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

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

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

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

    QList: Out of memory

    请注意上面链接中polishunpolish 的使用。

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

    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 类调试的自动渲染的所有细节字符串表示。

    希望对您有所帮助。

    【讨论】:

    • 经过更多测试,看来我的问题可能与在物理创建之后(当然)但在调用 exec() 之前发送到控制台窗口的测试消息有关在 QApplication 上。但是,如果富文本看起来是一个更好的选择,那么我可能会选择它。感谢您的信息。
    • 以防万一其他人有这个问题,我找到了一个解决方案 - 小部件上的 unpolish() 和 Polish() 导致通过样式表设置的任何 QProperties 正确更新,这意味着它们在代码中的值是然后在调用波兰函数后成为当前的。
    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多