2014-10-28 87 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和波蘭的孩子還曾