首页 > 解决方案 > 父母存在时不出现QWidget背景图像

问题描述

我有一个简单的小部件,它使用图像作为背景并包含一些子小部件。当我在没有父母的情况下创建它(作为对话)时,一切都很完美。但是,如果我将它创建为其他小部件的子级,我将看不到背景。

我可以使用 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 中的错误,如此处所述Panel因此我尝试通过在和中重新实现以下内容来过滤掉 ThemeChange 事件MainWindow

bool event(QEvent *event) override
{
    if (event->type() != QEvent::ThemeChange)
    {
        return QWidget::event(event);
    }
    return true;
}

那没有帮助。

标签: qtqwidget

解决方案


QPalette我没有用in画我的背景,而是resizeEvent发现答案是用QPainterin画它paintEvent

#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_;
};

推荐阅读