在主窗口中,我可以为不同的标准小部件设置CSS样式:
setStyleSheet(" QComboBox {background-color:red;} QLabel {background-color:blue;}")
这些样式将应用于具有这些名称的子窗口小部件。
但是有可能以同样的方式为我定义的小部件设置样式吗?
然后这个小部件应该通过其类名获得它的样式。我似乎找不到按类名获取样式表的相应函数。
这是一个例子。
---定制widget.h ---
#include <QWidget>
class MyCustomWidget : public QWidget {
Q_OBJECT
public:
MyCustomWidget(QWidget *parent) : QWidget(parent) { }
};
--- --- main.cpp中
#include <QApplication>
#include <QWidget>
#include <QLayout>
#include <QLabel>
#include "custom-widget.h"
int main(int argc, char **argv) {
QApplication app (argc, argv);
QWidget mainWindow;
QVBoxLayout mainLayout(&mainWindow);
QLabel label("I am a label", &mainWindow);
MyCustomWidget customWidget(&mainWindow);
mainLayout.addWidget(&label);
mainLayout.addWidget(&customWidget);
customWidget.setMinimumSize(100, 300);
mainWindow.setStyleSheet(
"QLabel { background-color: #5ea6e3; }"
"MyCustomWidget { background-color: #f00000; }"
);
mainWindow.show();
return app.exec();
}
--- --- main.pro
CONFIG += qt
QT += core gui widgets
TEMPLATE = app
TARGET = main
HEADERS = main.h custom-widget.h
SOURCES = main.cpp
答案 0 :(得分:0)
是的,样式可以在你自己的小部件上正常工作。
如果您要设置非标准属性,则需要使用Q_PROPERTY
声明它们。例如:
class MyWidget : public QWidget
{
Q_OBJECT
Q_PROPERTY(QString extra READ extra WRITE setExtra)
//...
};
然后你可以设置它的样式:
MyWidget {
background-color: blue;
color: yellow;
qproperty-extra: "Some extra text";
}
对于代码示例中的窗口小部件,永远不会绘制背景。需要更改其构造函数以要求Qt使用样式信息绘制背景:
MyCustomWidget(QWidget *parent) : QWidget(parent) {
setAttribute(Qt::WA_StyledBackground);
}
答案 1 :(得分:0)
将样式表应用于自定义QWidget派生类时,不要忘记覆盖the documentation中提到的paintEvent:
QWidget仅支持背景,背景剪辑和 背景源属性。
如果您是QWidget的子类,则需要提供paintEvent 您的自定义QWidget如下所示
警告:确保为自定义小部件定义Q_OBJECT宏。
void CustomWidget::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}