向QWidget中添加图片,并使图片随窗体大小缩放

###向QWidget中添加图片有多种方式,其中一种方法如下:

// 部分核心代码片段 在Qt 5.7中编译通过
QWidget * widget = new QWidget;
widget->setAutoFillBackground(true);
QImage image;
QPalette palette;
image.load("picture_path/name.png"); // 指定图片所在位置及图片名
palette.setBrush(this->backgroundRole(),QBrush(image));
widget->setPalette(palette);

这样就可以在QWidget上添加一张图片了。但是,我们发现这样简单的处理,是有问题的。例如,代码刚运行起来,显示可能是正常的,但当我们改变窗体大小的时候,图片显示效果和想象中的开始有些差别了,例如,图片可能并没有填充,而是平铺等等。这种情况,可能是图片的分辨率刚好和窗体默认大小相当,当窗体大小更改后,二者不再相适应所引起的。要解决这个问题,我们需要在窗体大小变更后,获取窗体大小,并用它将图片的大小重新设置一次。

基本上有两种方式来实现这个效果,其一是重新实现resizeEvent(QResizeEvent * event)函数;其二是通过添加事件监视器的方式。

方式一:重新实现resizeEvent

class MyPicture : public QMainWindow
{
    Q_OBJECT
public:
    explicit MyPicture(QWidget * parent = 0) : QWidget(parent)
    {
        widget = new QWidget;
        this->setCentralWidget(widget);
        hboxlayout = new QHBoxLayout(widget);
        setAutoFillBackground(true);
    }
    void resizeEvent(QResizeEvent *event)
    {
        Q_UNUSED(event)
        QImage image;
        QPalette palette;
        image.load("图片路径及名称");
        palette.setBrush(this->backgroundRole(), QBrush(image.scaled(this->size()));
        this->setPalette(palette);
    }
    ...... // other operation
private:
    QWidget * widget;
    QHBoxLayout * hboxlayout;
};

方式二:添加事件监视器
假定自定义了一个类class_A,但没有重写resizeEvent,我们可以先写一个简单的、如下所示的类:

class MyFilterObject : public QObject
{
    Q_OBJECT
public:
    explicit MyFilterObject(QObject * parent = 0) : QObject(parent) {}
    bool eventFilter(QObject * watched, QEvent * event)
    {
        if (QEvent::Resize == event->type())
        {
            QWidget * widget = qobject_cast<QWidget *>(watched);
            QImage image;
            QPalette palette;
            image.load(":/image/test.png");
            palette.setBrush(widget->backgroundRole(), QBrush(image.scaled(widget->size(), Qt::IgnoreAspectRatio, Qt::FastTransformation)));
            widget->setAutoFillBackground(true);
            widget->setPalette(palette);
        }
    }
}

然后在自定义的类class_A的相关函数中添加如下代码:

void class_A::foo()
{
    ...
    QWidget * widget = new QWidget;
    MyFilterObject * filter = new MyFilterObject;
    QEvent * event = new QEvent(QEvent::Resize);
    widget->installEventFilter(filter);  // 安装监视器
    filter->eventFilter(widget, event);
    ...
}

使用二者中的任何一个,再次运行程序,当改变窗体大小时,发现图片大小随着窗体的改变而变化了。有一个问题,就是能明显的感觉到图片缩放是有延迟的。或许有更好的实现方式,还请知道的小伙伴不吝赐教!在此谢过先(_)

展开阅读全文

没有更多推荐了,返回首页