• qt 滑动查看图片效果


    录制_2022_09_08_17_42_06_223

    功能: 

    1 、可以用鼠标滑动、点击 查看图片,

    2、可以用鼠标滚轮查看图片

    3、左右按钮可自动隐藏和显示,点击切换图片

    几个核心代码:

    1. 图片按照顺序显示

    当图片按照顺序命名,如(1,2,3,4,5,6,7,8,9,10,11,。。。)。程序从文件夹读取的顺序是混乱的,需要重新进行排序。 下面是完整的获取文件夹中的图片

    1. // 当前程序路径
    2. QDir dirCurrentPath = QCoreApplication::applicationDirPath();
    3. // 获取图片所在文件夹
    4. QString filePath = dirCurrentPath.absoluteFilePath("picture");
    5. QDir dir(filePath);
    6. if (!dir.exists())
    7. {
    8. QMessageBox::critical(this,tr("文件夹不存在"),tr("文件夹找不到"));
    9. return;
    10. }
    11. //设置文件名称过滤器, 查看路径中后缀为.jpg 、.jpeg格式的文件
    12. QStringList filters;
    13. filters<<QString("*.jpg") << QString("*.jpeg");
    14. dir.setFilter(QDir::Files | QDir::NoSymLinks); //设置类型过滤器,只为文件格式
    15. dir.setNameFilters(filters); //设置文件名称过滤器,只为filters格式
    16. //--2 获取当前路径下所有的文件名字
    17. QStringList fNames = dir.entryList(QDir::Files,QDir::Name);
    18. /*
    19. * QCollator类
    20. * QCollator使用QLocale和可选的排序策略进行初始化。它尝试用指定的值初始化collator。然后,可以使用collator以依赖于语言环境的方式对字符串进行比较和排序。
    21. */
    22. // 对文件进行排序 (1,2,3,4,5,6,7,8,9,10,11....)
    23. QCollator collator;
    24. collator.setNumericMode(true);
    25. std::sort(fNames.begin(), fNames.end(),
    26. [& collator](const QString & str1, const QString & str2)
    27. {
    28. return collator.compare(str1, str2) < 0;
    29. });
    30. // 拼接完整路径
    31. foreach (QString item, fNames) {
    32. fileNames<< dir.absoluteFilePath(item);
    33. }

    2.  绘制图片用到的函数和变量

    代码太多了, 全部写上看着费劲

    1. struct ShowPicInfor
    2. {
    3. ShowPicInfor() {}
    4. QRectF picRect;
    5. int picIndex;
    6. QString picPath;
    7. };
    8. class PictureScroll : public QWidget
    9. {
    10. Q_OBJECT
    11. public:
    12. explicit PictureScroll(QWidget *parent = nullptr);
    13. ~PictureScroll();
    14. protected:
    15. void paintEvent(QPaintEvent *) override;
    16. void mousePressEvent(QMouseEvent *event) override;
    17. void mouseMoveEvent(QMouseEvent *event) override;
    18. void mouseReleaseEvent(QMouseEvent *event) override;
    19. void wheelEvent(QWheelEvent *event) override;
    20. virtual void resizeEvent(QResizeEvent *event) override;
    21. signals:
    22. void selectPicture(QString picName);
    23. public slots:
    24. void on_previousPic();
    25. void on_nextPic();
    26. private:
    27. void paintPicture(QPainter &painter,const int picIndex, int deviation);//画图
    28. void calculateTheMovingPosition(int x_pos);
    29. private:
    30. int Mouse_Press; //鼠标拖动值
    31. int Deviation; //中心图片显示的位置
    32. int min_height; // 控件高度
    33. int Now_Value; // 中间显示的图片编号
    34. bool isSelected; // 是否有图片被选中, 没有选中,鼠标移动不起作用
    35. int backgauge = 6; // 预留边距
    36. QList listRect; // 记录所有的图片
    37. QString selectPic; // 当前选中图片名称
    38. QStringList fileNames; // 图片名
    39. };

    3. 在QLabel上添加 QPushbutton

    1. void MainWindow::addTwoNuttonsToTheLabel()
    2. {
    3. QHBoxLayout *firstRow= new QHBoxLayout;//第一行放个水平布局器
    4. myLeftButton = new MyPushButton(QIcon(":/img/ico/left.png"));
    5. connect(myLeftButton,&MyPushButton::click,[=](){ emit fPicScroll->previousPic(); });
    6. firstRow->addWidget(myLeftButton);
    7. // 水平
    8. QSpacerItem* hSpacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
    9. firstRow->addSpacerItem(hSpacer);
    10. // // 垂直
    11. // QSpacerItem* vSpacer = new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding);
    12. // firstRow->addSpacerItem(vSpacer);
    13. myRightButton = new MyPushButton(QIcon(":/img/ico/right.png"));
    14. connect(myRightButton,&MyPushButton::click,[=](){emit fPicScroll->nextPic();});
    15. firstRow->addWidget(myRightButton);
    16. ui->label->setLayout(firstRow);
    17. }

    4. 按钮的显示和 点击

    用ispress 添加点击灰色背景,mouserEnter 判断是否要绘制

    1. class MyPushButton : public QPushButton
    2. {
    3. Q_OBJECT
    4. public:
    5. MyPushButton(const QIcon &icon);
    6. protected:
    7. void paintEvent(QPaintEvent *) override;
    8. virtual void mousePressEvent(QMouseEvent *event);
    9. virtual void mouseReleaseEvent(QMouseEvent *event);
    10. virtual void enterEvent(QEvent *event);
    11. virtual void leaveEvent(QEvent *event);
    12. signals:
    13. void click();
    14. private :
    15. QIcon m_icon;
    16. bool isPress;
    17. bool mouseEnter;
    18. };

  • 相关阅读:
    java-net-php-python-ssm电影推荐网站计算机毕业设计程序
    linux 安装gradle7.4.2环境
    C语言字符转数字函数
    《深度探索C++对象模型》阅读笔记 第五章 构造、解构、拷贝语意学
    superset连接Apache Spark SQL(hive)过程中的各种报错解决
    JAVA集合,TreeMap排序
    R语言计算方差分析的F值和P值
    画图中编辑颜色47种颜色rgb格式
    数据结构 - 泛型
    37-Spring
  • 原文地址:https://blog.csdn.net/chen1231985111/article/details/126769289