【问题标题】:Qt statusbar colorQt 状态栏颜色
【发布时间】:2011-08-13 07:19:59
【问题描述】:

我将 Qt 与 Python 一起使用,并且我有一个底部带有状态栏的主窗口。我可以使用 QLabel 在栏中显示一条消息,并使用类似 "<font color=\"green\">In progress</font>" 的 QLabel 文本设置该消息的颜色。

我还想在状态栏中放置一条临时消息,并为该消息指定颜色。但是,由于这次不是 QLabel(我使用的是 QStatusBar::showMessage,它只需要一个 QString)我不能再改变颜色了。上面的标签无法识别,整个字符串"<font color=\"green\">In progress</font>" 显示为灰色。

有人有什么想法吗?

【问题讨论】:

    标签: python qt qstatusbar


    【解决方案1】:

    Python中使用

    self.statusBar().setStyleSheet("color : pink") 
    

    【讨论】:

      【解决方案2】:

      到目前为止我能找到的最短解决方案:

          ui->statusBar->setStyleSheet("color: red");
          ui->statusBar->showMessage("Your error message", 2000);
          QTimer::singleShot(2000, [this]{ ui->statusBar->setStyleSheet("color: black"); }); 
      

      虽然它不是 100% 干净的 - 如果在计时器运行时间的 2 秒内触发了另一条此类消息,则颜色可能过早变回。但在实践中,这几乎没有任何意义。

      【讨论】:

        【解决方案3】:

        很遗憾,QStatusBar::showMessage() 不支持富文本格式。这甚至在很久以前被报道为feature request,但似乎没有得到足够的关注。

        我认为您最好的选择是坚持使用纯文本消息直接操作您现有的QLabel。这将需要一些额外的工作来处理临时状态更改,因此由您决定是否值得麻烦。

        【讨论】:

        • 感谢 Karol,知道 Qt 无法直接实现这一点很有帮助。如果它对其他人有帮助,我想出了另一个解决方案。我使用 AddWidget 向状态栏添加了一个 QLabel,然后创建了一个计时器来定期清除该标签。之后我要做的就是确保在 QLabel 使用新文本更新时重置计时器。
        • 很高兴听到您找到了方法。 Qt 就是这样,这里和那里都有一些限制,但大多数时候你可以找到解决方法。至少这是我对 4.3 的印象。
        【解决方案4】:

        您还可以继承 QStatusBar 并实现“彩色”状态消息,例如(在 C++ 中):

        class QStatusBarX : public QStatusBar
        {
          public:
        
          QStatusBarX::QStatusBarX(QWidget * parent = 0)
          {
          }
        
          QStatusBarX::~QStatusBarX(void)
          {
          }
        
          void showMessageGreen(const QString & message)
          {
            this->setStyleSheet("color: green");
            this->showMessage(message);
          }
        };
        

        【讨论】:

          【解决方案5】:

          要为 QStatusBar 设置背景或文本颜色,请在显示消息之前更改它的 styleSheet:

              self.status.setStyleSheet("QStatusBar{padding-left:8px;background:rgba(255,0,0,255);color:black;font-weight:bold;}")
              self.status.showMessage("Error Cannot determine filepath", msecs= 5000)
          

          init 上,将 QStatusBar 的 messageChanged(QString) 连接到 statusChanged() 函数。

              def statusChanged(self, args):
                  '''If there are no arguments (the message is being removed) 
                  change the background back to transparent/ text back to black'''
                  if not args:
                      self.status.setStyleSheet("QStatusBar{padding-left:8px;background:rgba(0,0,0,0);color:black;font-weight:bold;}") 
          

          T

          【讨论】:

            【解决方案6】:

            如果你的showMessages文本都是相同的颜色,你可以通过QtDesigner(窗口文本颜色)在QStatusBar的调色板中定义它用于临时消息,然后使用QLabel颜色用于不同颜色的正常和永久消息。

            【讨论】:

            • 太棒了!在 Qt Designer 中,单击某处的窗口使其成为当前对象,转到属性编辑器中向下约 1/3 处的 palette,“窗口文本”就在顶部。还将影响子小部件,例如您已添加到 Qt Designer 窗口的选项卡小部件中的选项卡名称。但它似乎并没有影响您以编程方式添加的每个小部件,这很好。如果是这样并且不需要,则使用子小部件的样式表覆盖颜色。
            猜你喜欢
            • 2018-03-01
            • 2019-11-25
            • 2015-11-20
            • 2021-06-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-06
            • 2019-09-18
            相关资源
            最近更新 更多