代码之家  ›  专栏  ›  技术社区  ›  Stewart

当父存在时,QWIDGET背景图像不出现

  •  0
  • Stewart  · 技术社区  · 7 年前

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

    我可以使用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;
    }
    

    那没用。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Stewart    7 年前

    而不是用 QPalette 在里面 resizeEvent 我发现答案是用 QPainter 在里面 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_;
    };