2013-10-02 22 views
0

我試圖畫一個複選框QStyledItemDelegate。我希望複選框與本地外觀不同,但是使用qApp->setStyleSheet()指定的樣式。我不知道爲什麼,但是當我用QStyle::drawPrimitive來繪製控制權時 - 它並沒有提到全局qss。如何使用QStyle和指定的QSS繪製控件?

是否有任何解決方案,如何手動繪製複選框與應用程序樣式?

以下代碼,演示截圖我的問題:

CheckBox sample

第一個複選框是QStyle::drawPrimitive戰平,第二個複選框是小部件。

#include <QApplication> 
#include <QWidget> 
#include <QStyle> 
#include <QPainter> 
#include <QStyleOptionButton> 
#include <QCheckBox> 

class TestWindow 
    : public QWidget 
{ 
    Q_OBJECT 

public: 
    TestWindow() {} 
    ~TestWindow() {} 

    void paintEvent(QPaintEvent * event) 
    { 
     QPainter p(this); 

     QStyleOptionButton opt; 
     opt.state |= QStyle::State_On; 
     opt.state |= QStyle::State_Enabled; 
     opt.rect = QRect(10, 10, 20, 20); 

     style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &opt, &p, this); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    a.setStyleSheet("QCheckBox::indicator{ border: 1px solid red; }"); 

    TestWindow w; 
    QCheckBox *cb = new QCheckBox(&w); 
    cb->move(10, 30); 

    w.show(); 

    return a.exec(); 
} 

#include "main.moc" 

注:它是可能創造無形的複選框,並使用QPixmap::grabWidget,但這種方法是太重了。

回答

2

的Qt目前does not support這種繪圖:

警告:Qt樣式表目前不支持自定義將QStyle 子類。我們計劃在未來的某個版本中解決這個問題。

0
QPainter p(this); 

QStyleOptionButton opt; 
opt.state |= QStyle::State_On; 
opt.state |= QStyle::State_Enabled; 
opt.rect = QRect(10, 10, 20, 20); 

QCheckBox cb(this); // create fake checkbox 

style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &opt, &p, &cb); // pass a pointer to checkbox instead of "this" 
+2

歡迎來到Stack Overflow!你能否請你的答案給出解釋爲什麼這個代碼回答這個問題?僅限代碼答案[不鼓勵](http://meta.stackexchange.com/questions/148272),因爲他們沒有教導解決方案。 – DavidPostill

相關問題