向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); ... }
使用二者中的任何一个,再次运行程序,当改变窗体大小时,发现图片大小随着窗体的改变而变化了。有一个问题,就是能明显的感觉到图片缩放是有延迟的。或许有更好的实现方式,还请知道的小伙伴不吝赐教!在此谢过先(^_^)
相关文章推荐
- java swing 怎样添加背景图片并且能根据窗口大小进行缩放
- 图片编辑中的图片添加,旋转,缩放,删除;文字的添加,大小缩放,字体更换,颜色更换,删除
- java swing 怎样添加背景图片并且能根据窗口大小进行缩放(来自网络)
- 窗体中有一个图片框,显示一副图片。要求:1)在窗体打开时,动态加载图片;2)设置图片显示模式为根据图片框大小缩放图片;3)图片自己找;4)当鼠标停留在图片框时,显示“**风光”提
- 通过鼠标中间滚轮来缩放图片大小
- css控制背景图片随div的大小而缩放
- QT让一个图片随窗体缩放
- 滚动鼠标滚轴,缩放图片大小收藏
- UIImage 图片处理:截图,缩放,设定大小,存储
- Jtable添加图片,并自由改变图片大小
- Glide 入门到精通之四——图片缩放和调整大小
- matlab把一个目录下的图片缩放到指定大小
- 控制IMG图片的大小缩放
- php GD库函数(保存不同大小的图片,即原图与缩放图片等)
- paip.提升用户体验-------在C++ Builder 中为Form窗体添加背景图片
- 设置窗体背景图片,并且让图片随着窗体的大小的调整而调整大小
- swing-窗体添加背景图片的2种方法
- 如何为JAVA窗体程序添加背景图片
- C#winform设置窗体自动缩放适应不同尺寸的电脑屏幕大小
- Java通过thumbnailator对图片进行缩放,裁剪,添加水印等..