Joh*_*itb 4 c++ qt qt4 qtstylesheets
我有这个小测试用例,应该显示两个小部件,一个完全重叠另一个小部件.一个是半透明的,所以其他小部件应该透过它.
为此,我使用类型选择器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();
}
Run Code Online (Sandbox Code Playgroud)
Chr*_*wet 10
使用带有QWidget子类的样式表时,您应该以paintEvent这种方式覆盖:
void Menu::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
Run Code Online (Sandbox Code Playgroud)