qt 滑动查看图片效果

录制_2022_09_08_17_42_06_223

功能: 

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

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

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

几个核心代码:

1. 图片按照顺序显示

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

  // 当前程序路径
    QDir dirCurrentPath =  QCoreApplication::applicationDirPath();
    // 获取图片所在文件夹
    QString filePath = dirCurrentPath.absoluteFilePath("picture");

    QDir dir(filePath);
    if (!dir.exists())
    {
        QMessageBox::critical(this,tr("文件夹不存在"),tr("文件夹找不到"));
        return;
    }

    //设置文件名称过滤器, 查看路径中后缀为.jpg 、.jpeg格式的文件
    QStringList filters;
    filters<<QString("*.jpg") << QString("*.jpeg");
    dir.setFilter(QDir::Files | QDir::NoSymLinks); //设置类型过滤器,只为文件格式
    dir.setNameFilters(filters);  //设置文件名称过滤器,只为filters格式

    //--2 获取当前路径下所有的文件名字
    QStringList fNames = dir.entryList(QDir::Files,QDir::Name);

    /*
    *   QCollator类
    *   QCollator使用QLocale和可选的排序策略进行初始化。它尝试用指定的值初始化collator。然后,可以使用collator以依赖于语言环境的方式对字符串进行比较和排序。
    */
    // 对文件进行排序  (1,2,3,4,5,6,7,8,9,10,11....)
    QCollator collator;
    collator.setNumericMode(true);
    std::sort(fNames.begin(), fNames.end(),
    [& collator](const QString & str1, const QString & str2)
    {
    return collator.compare(str1, str2) < 0;
    });

    // 拼接完整路径
    foreach (QString item, fNames) {
        fileNames<< dir.absoluteFilePath(item);
    }

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

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

struct ShowPicInfor
{
    ShowPicInfor() {}

    QRectF picRect;
    int picIndex;
    QString picPath;
};


class PictureScroll : public QWidget
{
    Q_OBJECT
public:
    explicit PictureScroll(QWidget *parent = nullptr);
    ~PictureScroll();

protected:
    void paintEvent(QPaintEvent *) override;
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;
    void wheelEvent(QWheelEvent *event) override;
    virtual void resizeEvent(QResizeEvent *event) override;

signals:
     void selectPicture(QString picName);

public slots:
    void on_previousPic();
    void on_nextPic();

private:
     void paintPicture(QPainter &painter,const int picIndex, int deviation);//画图

    void  calculateTheMovingPosition(int x_pos);

private:
    int Mouse_Press;  //鼠标拖动值
    int Deviation;    //中心图片显示的位置
    int min_height;   // 控件高度
    int Now_Value;    // 中间显示的图片编号

    bool isSelected;  // 是否有图片被选中, 没有选中,鼠标移动不起作用

    int backgauge = 6;  // 预留边距
    QList<ShowPicInfor> listRect;     // 记录所有的图片
    QString selectPic;    // 当前选中图片名称

    QStringList fileNames;   // 图片名

};

3. 在QLabel上添加 QPushbutton

void MainWindow::addTwoNuttonsToTheLabel()
{
    QHBoxLayout *firstRow= new QHBoxLayout;//第一行放个水平布局器
    myLeftButton = new MyPushButton(QIcon(":/img/ico/left.png"));
    connect(myLeftButton,&MyPushButton::click,[=](){ emit fPicScroll->previousPic(); });

    firstRow->addWidget(myLeftButton);

    // 水平
    QSpacerItem* hSpacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
    firstRow->addSpacerItem(hSpacer);

    //    // 垂直
    //    QSpacerItem* vSpacer = new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding);
    //    firstRow->addSpacerItem(vSpacer);

    myRightButton = new MyPushButton(QIcon(":/img/ico/right.png"));
    connect(myRightButton,&MyPushButton::click,[=](){emit fPicScroll->nextPic();});

    firstRow->addWidget(myRightButton);
    ui->label->setLayout(firstRow);
}

4. 按钮的显示和 点击

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

class MyPushButton : public QPushButton
{
    Q_OBJECT
public:
    MyPushButton(const QIcon &icon);

protected:
    void paintEvent(QPaintEvent *) override;
    virtual void mousePressEvent(QMouseEvent *event);
    virtual void mouseReleaseEvent(QMouseEvent *event);

    virtual void enterEvent(QEvent *event);
    virtual void leaveEvent(QEvent *event);

signals:
    void click();

  private :
    QIcon m_icon;
    bool isPress;
    bool mouseEnter;

};

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值