自定义窗口小部件样式表未设置属性

时间:2014-10-28 14:36:15

标签: qt

我在项目中使用了自定义小部件,我尝试使用click事件更改背景颜色和标签颜色。背景颜色变化但标签颜色没有变化......希望有人可以帮助弄清楚我错在哪里......

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "myframe.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    MyFrame *frame = new MyFrame(this);
    ui->gridLayout_2->addWidget(frame);
    setStyleSheet("MyFrame {background-color: yellow;}"
              "MyFrame QLabel{color: black; font: bold 12px;}"
            "MyFrame[pressed=\"true\"] {background-color:red;}"
            "MyFrame[pressed=\"true\"] QLabel {color:white;}"
                );
}

MainWindow::~MainWindow()
{
    delete ui;
}

我的自定义窗口小部件//头文件

#ifndef MYFRAME_H
#define MYFRAME_H

#include <QFrame>
#include <QGridLayout>
#include <QLabel>
#include <QDebug>

class MyFrame : public QFrame
{
    Q_OBJECT
    Q_PROPERTY(bool pressed READ pressed WRITE setPressed)

    QGridLayout *layout;
    QLabel      *name;

public:
    explicit MyFrame(QWidget *parent = 0);

signals:

public slots:
    bool pressed();
    void setPressed(bool);

protected:
    bool mPressed;
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);

};

#endif // MYFRAME_H

//源文件

#include "myframe.h"

MyFrame::MyFrame(QWidget *parent) :
    QFrame(parent)
{
    mPressed = false;
    layout = new QGridLayout(this);
    setLayout(layout);
    name = new QLabel("button");
    layout->addWidget(name);
}

bool MyFrame::pressed()
{
    qDebug() << Q_FUNC_INFO << mPressed;
    return mPressed;
}

void MyFrame::setPressed(bool status)
{
    qDebug() << Q_FUNC_INFO << status;
    mPressed = status;
}

void MyFrame::mousePressEvent(QMouseEvent *event)
{
    qDebug() << Q_FUNC_INFO << "mouse pressed";
    setPressed(true);
    style()->unpolish(this);
    style()->polish(this);
}

void MyFrame::mouseReleaseEvent(QMouseEvent *event)
{
    qDebug() << Q_FUNC_INFO << "mouse released";
    setPressed(false);
    style()->unpolish(this);
    style()->polish(this);
}

框架背景颜色发生变化,但标签颜色在​​点击

时没有变化

2 个答案:

答案 0 :(得分:1)

似乎这个属性不是动态的。这意味着单击按钮时样式表不应更改颜色。解决此问题的一种方法是每次单击设置新样式表。在这种情况下,每个点击新样式表都将被解析,并将以正确的颜色应用。

true使用一种颜色,false使用另一种颜色。

"MyFrame[pressed=\"true\"] {background-color:red;}"
"MyFrame[pressed=\"false\"] {background-color:yellow;}"

目前我无法在文档中找到证明我的话的内容,但如果我在某些方面出错,请指点我。

https://bugreports.qt-project.org/browse/QTBUG-21762

如果样式表包含大量信息,那么您可以再次抛光窗口小部件(调用抛光)

答案 1 :(得分:1)

谢谢..解决了问题..

我已经试错了;)

style()->unpolish(this);
style()->unpolish(name);
style()->polish(this);
style()->polish(name);

这样做,即,未经抛光和抛光的孩子也工作