2012-03-05 1 views
4

두 개의 위젯을 보여줄 것으로 예상되는이 작은 테스트 케이스가 있습니다. 다른 위젯과 완전히 겹치지 않습니다. 하나는 반투명하므로 다른 위젯이 그것을 통해 빛나야합니다.Qt가이 스타일 시트 유형 선택기를 적용하지 않는 이유는 무엇입니까?

그런 목적을 위해 유형 선택자 Menu (클래스 이름 임)을 사용하여 하나의 위젯에 스타일 시트를 설정했습니다. 그러나 위젯을 200/255의 요소로 불투명하게 만드는 대신, 그것이 타입 선택기가 메뉴 객체에 전혀 적용되지 않는 것처럼 완전히 반투명하게 만들어서 더 이상 파란색의 빛이 보이지 않도록합니다.

대신 * 선택기를 사용하면 예상대로 작동합니다. 나는 정확하게 Menu을보고하는 metaObject()->className()의 값을 테스트했다. 누구든지 내가 제발 실수 한 것을 암시 할 수 있습니까? 이것은 훨씬 더 이상한 행동을 보여주는 실제 프로그램의 축소 된 테스트 케이스이며, 먼저이 축소 된 테스트 케이스 작업을 만들고 싶습니다.

#include <QtGui/QApplication> 
#include <QtGui/QWidget> 
#include <QtGui/QLayout> 
#include <QtGui/QVBoxLayout> 
#include <QtGui/QLabel> 
#include <QtGui/QResizeEvent> 

class Menu: public QWidget { 
    Q_OBJECT 

public: 
    Menu(bool translucent, QWidget *p):QWidget(p) { 
     if(translucent) { 
     setStyleSheet("Menu { background-color: rgba(0, 0, 150, 200) }"); 
     } 

     QLabel *label = new QLabel(
     translucent ? "\n\nHello I'm translucent" : "I'm not translucent"); 
     label->setStyleSheet("color: white; font-size: 20pt"); 

     QLayout *mylayout = new QVBoxLayout; 
     setLayout(mylayout); 
     mylayout->addWidget(label); 
    } 
}; 

class MyWindow : public QWidget { 
public: 
    MyWindow() { 
     Menu *m1 = new Menu(false, this); 
     Menu *m2 = new Menu(true, this); 

     m1->lower(); 
     m2->raise(); 
    } 

protected: 
    void resizeEvent(QResizeEvent *event) { 
     foreach(QWidget *w, findChildren<QWidget*>()) { 
     w->setGeometry(0, 0, width(), height()); 
     } 
    } 
}; 

int main(int argc, char **argv) { 
    QApplication app(argc, argv); 
    MyWindow w; 
    w.show(); 
    app.exec(); 
} 

답변

9

QWidget 서브 클래스와 스타일 시트를 사용하여, 당신은 paintEvent이 방법을 오버라이드 (override)로되어있다 :

void Menu::paintEvent(QPaintEvent *) 
{ 
    QStyleOption opt; 
    opt.init(this); 
    QPainter p(this); 
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); 
} 

stylesheet reference from Qt documentation를 참조하십시오.

+0

와우, 나는 절대적으로 * 전혀 몰랐습니다. 감사. –