为什么Qt不应用这个样式表类型选择器?

Why doesn't Qt apply this style sheet type-selector?

本文关键字:类型 选择器 样式 Qt 应用 为什么      更新时间:2023-10-16

我有一个小测试用例,它应该显示两个小部件,其中一个完全重叠。一个是半透明的,所以另一个小部件应该透过它发光

为此,我使用类型选择器Menu(它的类名)在一个小部件上设置了一个样式表。但是,它并没有使小部件不透明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 ? "nnHello 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();
}

当将样式表与QWidget子类一起使用时,应该通过以下方式覆盖paintEvent

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

请参阅Qt文档中的样式表参考。