2014-10-28 60 views
0

我有一个自定义小部件在我的项目中使用,我试图通过单击事件更改背景颜色和标签颜色。背景颜色的变化,但标签颜色不会改变......希望有人能帮助找出在我错了......自定义小部件样式表未设置属性

#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

我编辑为样式() - > unpolish(this);样式() - >抛光(本);解决了qframe背景颜色变化的问题。 – Abin 2014-10-28 14:48:05

+0

如果你将使用自定义的'QToolButton'而不是'QFrame',你将会产生相同的效果,而没有抛光/未抛光的魔法。只有QSS才能完成您的任务。 – 2014-10-28 15:09:22

+0

这只是一个示例应用程序。其实我需要一个自定义按钮,它有一个图像和3个标签..所以我用这样的 – Abin 2014-10-28 15:16:43

回答

1

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

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

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

目前我无法在文档中找到某些东西来证明我的话,但如果我错了某些东西,请点评我。

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

如果样式表中含有大量的信息,那么你就可以再次部件(称之为抛光)抛光

+1

你是对的,但没有官方文件。 Qt bugtracker中有一个功能请求,但由于性能原因它被拒绝了。 – 2014-10-28 15:07:41

1

谢谢..解决

我已经做了试验n错误的问题..;)

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

这样即unpolish和波兰的孩子还曾