【问题标题】:How to get stylesheet change event in a QWidget?如何在 QWidget 中获取样式表更改事件?
【发布时间】:2016-08-06 06:28:58
【问题描述】:

我正在尝试读取所有小部件的全局样式表并将其应用于 QApplication 实例。

这可以正确设置所有小部件的样式,除了我无法在主窗口构造函数及其子小部件的构造函数中查询样式选项,如字体和字体大小,因为此时样式表尚未应用于它。

所以我需要:

  • 要么使全局样式表在主窗口构造函数中可用;
  • 在应用样式表时捕获小部件中的事件。

有没有办法实现其中之一?

我的主窗口代码如下:

int main(int argc, char **argv)
{   
    QWSServer::QWSServer::setBackground(QBrush(QColor(0, 0, 0, 255)));
    QApplication app(argc, argv);

    QFile stylesheet("/usr/bin/app.qss");
    stylesheet.open(QFile::ReadOnly|QFile::Text);
    QTextStream styleSheetStyle(&stylesheet);

    app.setStyleSheet(styleSheetStyle.readAll());

    MainWindow * pWindow = new MainWindow();
    pWindow->setWindowFlags(Qt::FramelessWindowHint);
    pWindow->show();

    return app.exec();  
}

在需要样式的小部件中:

void paintText(QPixmap *target, const QString &text)
{
    QPainter painter(target);
    painter.setPen(QColor(184,188,193,255));
    painter.setFont(property("font").value<QFont>());
    style()->drawItemText(&painter, 
                         target->rect().adjusted(0,0,0,-15), 
                         Qt::AlignHCenter|Qt::AlignBottom, 
                         QPalette(QColor(184,188,193,255)), 
                         true, 
                         text);
    painter.end();
}

如果在小部件的构造函数中调用了该绘制函数,则字体为默认值,如果在显示事件中调用,则字体为全局样式表指定的字体。

但是那个函数只需要调用一次,所以我不想在 show 事件中绘制它,即使我可以使用一个标志让它只在第一个 show 事件上运行。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    每次更改样式时,都会调用 QWidget::changeEvent() 方法。重新实现该方法并检查 QEvent::StyleChange 事件类型。

    void CMyWidget::changeEvent(QEvent* e)
    {
        if (e->type() == QEvent::StyleChange)
        {
            // Style has been changed.
        }
    
        QWidget::changeEvent(e);
    }
    

    【讨论】:

      【解决方案2】:

      尝试在事件循环完成时在小部件构建后触发paintText。我想那个样式应该是可用的。

      您可以完成此操作,但将 QTimer::singleshot(0, this, SLOT(paintText())); 放入小部件构造函数中。

      确保 paintText() 是一个 SLOT。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-20
        • 2020-06-28
        • 2018-10-06
        • 2019-01-12
        • 1970-01-01
        • 1970-01-01
        • 2018-01-08
        • 1970-01-01
        相关资源
        最近更新 更多