parent 存在时 QWidget 背景图像不出现
QWidget background images not appearing when parent exists
我有一个简单的小部件,它使用图像作为背景并包含一些 child 小部件。当我在没有 parent(作为对话)的情况下创建它时,一切都很完美。但是,如果我将它创建为某个其他小部件的 child,我将看不到背景。
我可以使用 QWidget::setPalette 设置 child 小部件的背景吗?
如果没有,您将如何完成?
#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_;
};
如果我将此小部件创建为没有 parent 的独立 object,那么它将呈现良好。我看到了背景和 child 小部件。如果我将此小部件创建为另一个小部件的 child,那么我会看到 lowest-level child,但背景是空的。
#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);
}
};
上面的 class 以两种方式实例化小部件: solo
给我一个对话,一切看起来都很完美。 child
让我看看 Panel
的 child 小部件,但背景是白色的。
疑难解答详细信息
我认为这可能是 Qt 中描述的错误 here 所以我尝试通过在 Panel
和 MainWindow
.[=20= 中重新实现以下内容来过滤掉 ThemeChange 事件]
bool event(QEvent *event) override
{
if (event->type() != QEvent::ThemeChange)
{
return QWidget::event(event);
}
return true;
}
这没有帮助。
我没有在 resizeEvent
中用 QPalette
绘制背景,而是在 paintEvent
中用 QPainter
绘制背景。
#include <QWidget>
#include <QPixmap>
#include <QPainter>
#include <QLabel>
class Panel : public QWidget
{
Q_OBJECT
public:
explicit Panel(QWidget *parent = 0) : QWidget(parent)
{
bgnd_ = new QPixmap(":/path/to/image.png");
QLabel* lbl = new QLabel("Hello",this);
}
protected:
void paintEvent( QPaintEvent* e )
{
QPainter painter( this );
painter.drawPixmap( 0, 0, bgnd_->scaled(size(), Qt::IgnoreAspectRatio));
QWidget::paintEvent( e );
}
private:
QPixmap* bgnd_;
};
我有一个简单的小部件,它使用图像作为背景并包含一些 child 小部件。当我在没有 parent(作为对话)的情况下创建它时,一切都很完美。但是,如果我将它创建为某个其他小部件的 child,我将看不到背景。
我可以使用 QWidget::setPalette 设置 child 小部件的背景吗?
如果没有,您将如何完成?
#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_;
};
如果我将此小部件创建为没有 parent 的独立 object,那么它将呈现良好。我看到了背景和 child 小部件。如果我将此小部件创建为另一个小部件的 child,那么我会看到 lowest-level child,但背景是空的。
#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);
}
};
上面的 class 以两种方式实例化小部件: solo
给我一个对话,一切看起来都很完美。 child
让我看看 Panel
的 child 小部件,但背景是白色的。
疑难解答详细信息
我认为这可能是 Qt 中描述的错误 here 所以我尝试通过在 Panel
和 MainWindow
.[=20= 中重新实现以下内容来过滤掉 ThemeChange 事件]
bool event(QEvent *event) override
{
if (event->type() != QEvent::ThemeChange)
{
return QWidget::event(event);
}
return true;
}
这没有帮助。
我没有在 resizeEvent
中用 QPalette
绘制背景,而是在 paintEvent
中用 QPainter
绘制背景。
#include <QWidget>
#include <QPixmap>
#include <QPainter>
#include <QLabel>
class Panel : public QWidget
{
Q_OBJECT
public:
explicit Panel(QWidget *parent = 0) : QWidget(parent)
{
bgnd_ = new QPixmap(":/path/to/image.png");
QLabel* lbl = new QLabel("Hello",this);
}
protected:
void paintEvent( QPaintEvent* e )
{
QPainter painter( this );
painter.drawPixmap( 0, 0, bgnd_->scaled(size(), Qt::IgnoreAspectRatio));
QWidget::paintEvent( e );
}
private:
QPixmap* bgnd_;
};