您的位置:首页 > 其它

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

2017-11-16 10:23 85 查看

向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_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);
...
}


使用二者中的任何一个,再次运行程序,当改变窗体大小时,发现图片大小随着窗体的改变而变化了。有一个问题,就是能明显的感觉到图片缩放是有延迟的。或许有更好的实现方式,还请知道的小伙伴不吝赐教!在此谢过先(^_^)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: