为什么Qt不应用这个样式表类型选择器?
Why doesn't Qt apply this style sheet type-selector?
我有一个小测试用例,它应该显示两个小部件,其中一个完全重叠。一个是半透明的,所以另一个小部件应该透过它发光
为此,我使用类型选择器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文档中的样式表参考。
相关文章:
- 根据模板类型选择类模板的成员类型?
- 重载模板函数未为特定类型选择正确的版本
- QT 样式表主题,适用于使用属性选择器的整个应用程序
- C++ gtkmm:文件选择器对话框不适用于任何驱动器
- 表达式到C++类类型转换器/类型转换
- 菜单选择器不接受有效输入
- Cocos2dx 如何在没有调度选择器的情况下每 5 秒调用一次函数
- 函数模板 - 使用同一类型调用时,使用不同的参数类型选择函数
- 使用声明类型选择函数专业化
- 如何在Qt中创建自定义颜色选择器
- 随机数组选择器
- 根据输入类型选择正确的结构方法
- 克里昂未初始化记录类型:播放器
- 如何编写尽可能薄的类型包装器
- VTK抽象选择器,用于不同不透明度值的多个参与者
- 编译器如何知道为多态类型选择哪个函数
- Cocoa 选择器的行为可以在 C++ 中重新实现吗?
- 根据按键类型选择地图或unordered_map
- 为什么Qt不应用这个样式表类型选择器?
- 可变constexpr类型选择器