Qt 仿QQ图片查看器

最近项目中,由于需要查看图片。看了网上写的各种图片查看器。感觉都没有QQ图片查看器那种界面好看一点。并且放大了可以移动图片。为此,想着仿QQ图片查看器自己写了一个,如图:


主要实现的功能有:

  1. 鼠标滚轮可以缩小,放大图片。
  2. 界面自动大小自动调整,默认为720*540.当图片大小超过这个时候,界面调整为图片大小。
  3. 只有图片大小大于界面大小的时候,图片才可以进行移动。
  4. 重写paintEvent 纯QWidget绘制。

这里主要记录一下开发过程中遇到的问题:

  1. 提取QQ中的资源文件:
    在网上下载了一个提取QQ资源文件(PS:好评率100%)直接找到QQ的安装目录,再去寻找。
  2. A类继承了QWidget,并且在A类中已经有了布局(QVBoxLayout,QHBoxLayout)。这个时候如果写一个B类继承A类。在B类中使用布局,会无效。
    一开始的想法是:
    Qt 仿QQ图片查看器_第1张图片
    首先,界面框架继承QWidget类(A类)采用无边框窗体并且可以界面可拖动.当鼠标移动到相应的位置,显示关闭按钮,上一张,下一张。否则不显示。
    然后想着继承A类(保持父类的界面),然后添加一个QLabel用来显示图片。然后让图片填充满整个界面,通过操作QLabel来显示图片。但是,在“让图片填充满整个界面”的时候,采用布局,这个时候布局一直无效。因此就放弃了这种方案。直接采用重写paintEvent绘制图片显示。
  3. 当图片过大(超过指定的限时区域),可以移动图片的过程中,主要是考虑位置的移动,超过部分不显示,具体可参考:
    QT-Qpixmap实现图片鼠标缩放,鼠标拖动示例(详解)
    这里我采用的是drawPixmap 的2个函数:
    if((xPoint>0)&&(yPoint>0)){
        //这里清零,可以保证,放大以后拖动到其他位置后缩小,不会改变处于中下位置.
        int offSetX = xPoint;
        int offSetY = yPoint;
        painter.drawPixmap(offSetX,offSetY,m_pixmap);
    }else{
        painter.drawPixmap (x,y,w,h,m_pixmap,sx,sy,w,h);             //绘画图形
    }
  1. 重写事件的时候,如果需要将该继续向上传递处理。则需要返回相应的事件:
    如:
void QImageViewLabel::mouseMoveEvent(QMouseEvent *event)
{
	......
	QWidget::mouseMoveEvent(event);//继续传递给父亲
}

如果不需要继续传递则直接返回 return true.
如果返回值是 true,那么 Qt 会认为这个事件已经处理完毕,不会再将这个事件发送给其它对象,而是会继续处理事件队列中的下一事件。

有关于事件的机制可参考:
事件机制.
Qt 仿QQ图片查看器_第2张图片

代码:
Qt 仿QQ图片查看器

你可能感兴趣的:(qt,图片浏览器)