Почему Qt не применяет этот селектор типов таблицы стилей? - PullRequest
4 голосов
/ 05 марта 2012

У меня есть маленький тестовый пример, который должен показать два виджета, один из которых полностью перекрывает другой. Один полупрозрачный, поэтому другой виджет должен просвечивать через него.

Для этой цели я установил таблицу стилей для одного виджета, используя селектор типа 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 ? "\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();
}

1 Ответ

10 голосов
/ 05 марта 2012

При использовании таблиц стилей с подклассами QWidget вы должны переопределить paintEvent следующим образом:

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

См. Ссылку на таблицу стилей в документации Qt .

...