У меня есть маленький тестовый пример, который должен показать два виджета, один из которых полностью перекрывает другой. Один полупрозрачный, поэтому другой виджет должен просвечивать через него.
Для этой цели я установил таблицу стилей для одного виджета, используя селектор типа 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();
}