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

来源:互联网 发布:淘宝怎么设置地区运费 编辑:程序博客网 时间:2024/05/17 04:40

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

// 部分核心代码片段 在Qt 5.7中编译通过QWidget * widget = new QWidget;widget->setAtuoFillBackground(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_OBJECTpublic:    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 operationprivate:    QWidget * widget;    QHBoxLayout * hboxlayout;};

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

class MyFilterObject : public QObject{    Q_OBJECTpublic:    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);    ...}

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

原创粉丝点击