我有一个简单的小部件,它使用图像作为背景,并包含一些子部件。当我在没有父母(作为对话)的情况下创作它时,一切都是完美的。但是如果我把它创建为其他小部件的子部件,我就看不到背景。
我可以使用qwidget::setPalette设置子小部件的背景吗?
如果没有,你会怎么做?
#include <QWidget>
#include <QPixmap>
#include <QPalette>
#include <QLabel>
class Panel : public QWidget
{
Q_OBJECT
public:
explicit Panel(QWidget *parent = 0) QWidget(parent)
{
bgnd_ = new QPixmap(":/path/to/image.png");
PaintBackground();
QLabel* lbl = new QLabel("SomeChild",this);
}
private:
void PaintBackground()
{
QPixmap bgnd = bgnd_->scaled(this->size(), Qt::IgnoreAspectRatio);
QPalette palette;
palette.setBrush(QPalette::Background, bgnd);
this->setPalette(palette);
}
protected:
void resizeEvent(QResizeEvent *event)
{
QWidget::resizeEvent(event);
PaintBackground();
}
private:
QPixmap* bgnd_;
};
如果我创建这个小部件作为一个没有父对象的独立对象,那么它将呈现良好的效果。我看到了背景和小部件。如果我将这个小部件创建为另一个小部件的子,那么我看到最低级别的子,但背景是空的。
#include <QMainWindow>
#include "panel.h"
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0) :
QMainWindow(parent)
{
Panel* solo = new Panel();
solo->show();
Panel* child = new Panel(this);
}
};
上述类以两种方式实例化小部件:
solo
让我和所有看起来完美的事物对话。
child
让我看看
Panel
的子窗口小部件,但背景为白色。
疑难解答详细信息
我想这可能是qt中的一个bug
here
所以我试着通过在两个文件中重新实现以下内容来过滤掉Mechange事件
面板
和
MainWindow
.
bool event(QEvent *event) override
{
if (event->type() != QEvent::ThemeChange)
{
return QWidget::event(event);
}
return true;
}
那没用。