经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » 浏览器 » 查看文章
利用QT实现图片浏览器的示例详解
来源:jb51  时间:2023/2/24 9:06:46  对本文有异议

1、概述

案例:制作一个小的图片浏览器,要求可以显示jpg、jpeg、png、bmp。可以从电脑上拖动图到窗口并显示出来。 

实现步骤:

1.创建一个QWidget

2.在QWidget的构造方法中设置一个QLabel用户显示pixmap

3.在QWidget的protected中定义三个函数,dragEnterEvent(QDragEnterEvent *event)、dropEvent(QDropEvent *event)、resizeEvent(QResizeEvent *event);并在.cpp中实现这三个方法

4.在QWidget的构造函数中加入setAccessDrop(true),设置可向窗口拖拽内容

5.实现dragEnterEvent(拖拽)、dropEvent(拖拽放下)、resizeEvent(窗口重置)

6.实现第5步的三个方法

7.在drawEnterEvent中过滤可拖拽的文件

  1. void watershedwindow::dragEnterEvent(QDragEnterEvent *event){
  2. QStringList acceptedFileTypes;
  3. acceptedFileTypes.append("jpg");
  4. acceptedFileTypes.append("jpeg");
  5. acceptedFileTypes.append("bmp");
  6. acceptedFileTypes.append("png");
  7. if(event->mimeData()->hasUrls()&&event->mimeData()->urls().count()==1){
  8. QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());
  9. if(acceptedFileTypes.contains(file.suffix().toLower())){
  10. event->acceptProposedAction();//表明用户可以在窗口部件上拖放对象
  11. }
  12. }
  13. }

8.在dropEvent方法中实现文件拖拽放下后的情况,即显示图片

  1. void watershedwindow::dropEvent(QDropEvent *event){
  2. QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());
  3. if(pixmap.load(file.absoluteFilePath())){
  4. label->setPixmap(pixmap.scaled(label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
  5. }else{
  6. QMessageBox::critical(this,tr("Error"),tr("The image file count not be read"));
  7. }
  8. }

9.resizeEvent方法中对图像进行重置

  1. void watershedwindow::resizeEvent(QResizeEvent *event){
  2. Q_UNUSED(event);
  3. if(!pixmap.isNull()){
  4. label->setPixmap(pixmap.scaled(label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
  5. }
  6. }

10.结束

ps:下面是完整代码

2、代码示例

  1. #include "opencv2/opencv.hpp"
  2. #include <QWidget>
  3. #include <QSize>
  4. #include <iostream>
  5. #include <QPixmap>
  6. #include <QDragEnterEvent>
  7. #include <QDropEvent>
  8. #include <QMimeData>
  9. #include <QFileInfo>
  10. #include <QMessageBox>
  11. #include <QResizeEvent>
  12. #include <QStringList>
  13. #include <QLabel>
  14. using namespace cv;
  15. using namespace std;
  16. class watershedwindow : public QWidget
  17. {
  18. Q_OBJECT
  19. private:
  20. Mat src,gray,result,distanceImage;
  21. QPixmap pixmap;
  22. QLabel *label;
  23. public:
  24. explicit watershedwindow(QWidget *parent = nullptr);protected:
  25. /**
  26. * 拖进事件
  27. * @brief dragEnterEvent
  28. * @param event
  29. */
  30. void dragEnterEvent(QDragEnterEvent *event);
  31. /**
  32. * 拖进放下事件
  33. * @brief dropEvent
  34. * @param event
  35. */
  36. void dropEvent(QDropEvent *event) ;
  37. void resizeEvent(QResizeEvent *event);
  38. signals:
  39. };
  40. #include "watershedwindow.h"
  41. watershedwindow::watershedwindow(QWidget *parent) : QWidget(parent)
  42. {
  43. this->setAcceptDrops(true);//设置允许向窗口拖入图片
  44. this->setFixedSize(QSize(320,480));
  45. label = new QLabel(this);
  46. label->setFixedSize(this->width(),this->height());
  47. }
  48. void watershedwindow::dragEnterEvent(QDragEnterEvent *event){
  49. QStringList acceptedFileTypes;
  50. acceptedFileTypes.append("jpg");
  51. acceptedFileTypes.append("jpeg");
  52. acceptedFileTypes.append("bmp");
  53. acceptedFileTypes.append("png");
  54. if(event->mimeData()->hasUrls()&&event->mimeData()->urls().count()==1){
  55. QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());
  56. if(acceptedFileTypes.contains(file.suffix().toLower())){
  57. event->acceptProposedAction();//表明用户可以在窗口部件上拖放对象
  58. }
  59. }
  60. }
  61. void watershedwindow::dropEvent(QDropEvent *event){
  62. QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());
  63. if(pixmap.load(file.absoluteFilePath())){
  64. label->setPixmap(pixmap.scaled(label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
  65. }else{
  66. QMessageBox::critical(this,tr("Error"),tr("The image file count not be read"));
  67. }
  68. }
  69. void watershedwindow::resizeEvent(QResizeEvent *event){
  70. Q_UNUSED(event);
  71. if(!pixmap.isNull()){
  72. label->setPixmap(pixmap.scaled(label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
  73. }
  74. }
  75. }

3、演示图片

到此这篇关于利用QT实现图片浏览器的示例详解的文章就介绍到这了,更多相关QT图片浏览器内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号