4

私はこの小さなテストケースを持っています。これは、一方が他方に完全に重なっている2つのウィジェットを表示することになっています。1つは半透明なので、もう1つのウィジェットはそれを通して輝くはずです。

そのために、タイプセレクターMenu(クラス名)を使用して、1つのウィジェットにスタイルシートを設定しました。ただし、ウィジェットを係数で不透明にする代わりに200/255、タイプセレクターがメニューオブジェクトにまったく適用されていないかのように完全に半透明になるため、青の輝きが見えなくなります。

代わりに*セレクターを使用すると、期待どおりに機能します。metaObject()->className()を正しく報告するの値をテストしましたMenu。誰かが私が犯したエラーを教えてもらえますか?これは実際のプログラムの縮小されたテストケースであり、はるかに奇妙な動作を示します。最初に、この縮小されたテストケースを機能させたいと思います。

#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();
}
4

1 に答える 1

10

サブクラスでスタイルシートを使用するQWidget場合は、次のようにオーバーライドする必要がありますpaintEvent

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

Qtドキュメントのスタイルシートリファレンスを参照してください。

于 2012-03-05T16:56:15.610 に答える