我在项目中使用了自定义小部件,我尝试使用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);
}
框架背景颜色发生变化,但标签颜色在点击
时没有变化答案 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);
这样做,即,未经抛光和抛光的孩子也工作