2012-03-05 13 views
4

私は2つのウィジェットを表示するはずのこの小さなテストケースを持っています。もう1つは完全にオーバーラップしています。一方は半透明であるので、もう一方のウィジェットはそれを照らすべきです。Qtがこのスタイルシートタイプセレクタを適用しないのはなぜですか?

そのために、タイプセレクタMenu(クラス名)を使用して、1つのウィジェットでスタイルシートを設定しました。しかし、ウィジェットを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をこのように上書きすることになっている:

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

WOW、私は絶対に*分かりませんでした。ありがとう。 –

関連する問題