Qt小贴士:mousePressEvent(鼠标点击事件)的应用:点击某区域后进行图片的切换

在实际工程开发中遇到的实际问题,目前来进行一下总结:

工程需要:点击某个区域内的图片,之后在【主区域】内显示改图片。


  • 效果显示

点击【选择区域】中的图片,图片会显示到【主区域】中。

点击选择区域的第一张图片【未添加资源内容】

(图片均为500x280像素,工程要求规格,所以演示图片放大到主区域的时候分辨率会较低。)

会出现以下效果

以上内容分为【示例x】及【logo】,六张图片,均是添加到资源中的。

【未添加资源内容】是未添加到资源中的图片,是给予绝对路径后调用的图片。


  • 代码

主要思路是使用

  •  void mousePressEvent(QMouseEvent *event);

mousepressEvent事件,判断鼠标点击的区域,如果在区域中,进行图片的切换。

主线程.h中的内容

/***绘图线程***/
#include "imagethread.h"
#include<QThread>
#include<QPainter>
#include<QImage>
//线程锁
#include<QMutex>
//路径
#include<QDir>
#include<QFile>
//鼠标事件
#include<QMouseEvent>
#include <QAxObject>
protected:
    void mousePressEvent(QMouseEvent *event);

主线程.cpp中的内容

鼠标点击相应的区域后,鼠标的坐标会传递给下端代码中的x,y,之后x,y进行if判断中,判断鼠标点击的到底是哪儿个区域,是否是在【选择区域】的六个图片中。如果是,则发送信号,执行在绘图线程中的槽函数。(一下程序段中的数据均与【选择区域】的六张图片的位置有关)

关于绘图线程和绘图线程的设置之后后补充。

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    int x = event->x();
    int y = event->y();
    //第一列15,177,第二列195,357.5
    if(x>15&&x<177)//第一列
    {
        if(y>145&&y<236)//第一行
        {
            emit picturefrist();//第一张
        }
        else if(y>310&&y<401)//第二行
        {
            emit picturethree();//第三张
        }
        else if(y>475&&y<566)//第三行
        {
            emit picturefive();//第五行
        }
    }
    else if(x>195&&x<357.5)//第二列
    {
        if(y>145&&y<236)//第一行
        {
            emit picturesecond();//第二张
        }
        else if(y>310&&y<401)//第二行
        {
            emit picturefour();//第四张
        }
        else if(y>475&&y<566)//第三行
        {
            emit picturesix();//第六张
        }
    }
//    qDebug()<<"i"<<x<<"j"<<y;
    //进入判断,一旦是在对应的区域,立即执行信号和槽函数,调取多线程绘图的内容
}

本人另外开了一个线程进行绘图

主线程.h部分

private:
    Ui::MainWindow *ui;
    
    imagethread *imT;//绘图线程,将绘图线程的头文件包含在主线程中,变成预处理的形式

主线程.cpp初始化部分

/*********************************线程image*********************************************/
    //imagethread *imT;
    //QThread *imgthread;
    imT = new imagethread;//分配空间
    imgthread = new QThread(this);//指定父对象,子线程
    imT->moveToThread(imgthread);//自定义线程加入子线程

    //启动image子线程
    imgthread->start();//一开始就启动,执行等级更高
    //启动线程
    connect(this,&MainWindow::sendblinkpaper,imT,&imagethread::drawblink);//一开始,就画空白部分就好
    //初始化一下
    emit sendblinkpaper();

    connect(imT,&imagethread::imagepass,this,&MainWindow::getimage);//将画好的内容传递一下
    connect(this,&MainWindow::sendrealpaper,imT,&imagethread::drawtrue);//绘制已经拍到的图片
    /*************切换图片的信号和槽*************/
    connect(this,&MainWindow::picturefrist,imT,&imagethread::pfrist);
    connect(this,&MainWindow::picturesecond,imT,&imagethread::psecond);
    connect(this,&MainWindow::picturethree,imT,&imagethread::pthree);
    connect(this,&MainWindow::picturefour,imT,&imagethread::pfour);
    connect(this,&MainWindow::picturefive,imT,&imagethread::pfive);
    connect(this,&MainWindow::picturesix,imT,&imagethread::psix);
    /*************切换图片的信号和槽*************/
    /*********************************线程image*********************************************/

绘图线程.cpp的设置

void imagethread::drawblink()
{
    //定义QImage绘图设备
    QImage imageblink(1200,680,QImage::Format_ARGB32);//画幅大小,透明大小
    QPainter p(&imageblink);
//    p.drawPixmap(0,0,1200,680,QPixmap(":/image/ubk.png"));//画个背景

    //示例图片1(使用图片像素规格为500x280像素)
    QRectF targetf(15,145,162.5,91);//在前界面中显示大小的尺寸,前两个值是图片左上角的初始坐标值,之后是长和宽
    QRectF sourcef(0,0,500,280);//源文件图片需要显示的大小
    QImage iamgef;
    iamgef.load("C:/Users/Administrator/Desktop/w1.jpg");//打开指定目录的照片
    p.drawImage(targetf,iamgef,sourcef);//起始坐标,需要置入的照片

    //示例图片2(使用图片像素规格为500x280像素)
    QRectF targets(195,145,162.5,91);//在前界面中显示大小的尺寸,前两个值是图片左上角的初始坐标值,之后是长和宽
    QRectF sources(0,0,500,280);//源文件图片需要显示的大小
    QImage iamges(":/image/2.png");
    p.drawImage(targets,iamges,sources);//起始坐标,需要置入的照片

    //示例图片3(使用图片像素规格为500x280像素)
    QRectF targett(15,310,162.5,91);//在前界面中显示大小的尺寸,前两个值是图片左上角的初始坐标值,之后是长和宽
    QRectF sourcet(0,0,500,280);//源文件图片需要显示的大小
    QImage iamget(":/image/3.png");
    p.drawImage(targett,iamget,sourcet);//起始坐标,需要置入的照片

    //示例图片4(使用图片像素规格为500x280像素)
    QRectF targetfour(195,310,162.5,91);//在前界面中显示大小的尺寸,前两个值是图片左上角的初始坐标值,之后是长和宽
    QRectF sourcefour(0,0,500,280);//源文件图片需要显示的大小
    QImage iamgefour(":/image/4.png");
    p.drawImage(targetfour,iamgefour,sourcefour);//起始坐标,需要置入的照片

    //示例图片5(使用图片像素规格为500x280像素)
    QRectF targetfive(15,475,162.5,91);//在前界面中显示大小的尺寸,前两个值是图片左上角的初始坐标值,之后是长和宽
    QRectF sourcefive(0,0,500,280);//源文件图片需要显示的大小
    QImage iamgefive(":/image/5.png");
    p.drawImage(targetfive,iamgefive,sourcefive);//起始坐标,需要置入的照片

    //示例图片6(使用图片像素规格为500x280像素)
    QRectF targetsix(195,475,162.5,91);//在前界面中显示大小的尺寸,前两个值是图片左上角的初始坐标值,之后是长和宽
    QRectF sourcesix(0,0,500,280);//源文件图片需要显示的大小
    QImage iamgesix(":/image/6.png");
    p.drawImage(targetsix,iamgesix,sourcesix);//起始坐标,需要置入的照片

    //示例图片logo(使用图片像素规格为500x280像素)
    QRectF targetlogo(375,155,725,406);//在前界面中显示大小的尺寸,前两个值是图片左上角的初始坐标值,之后是长和宽
    QRectF sourcelogo(0,0,500,280);//源文件图片需要显示的大小
    QImage iamgelogo(":/image/logo.png");
    p.drawImage(targetlogo,iamgelogo,sourcelogo);//起始坐标,需要置入的照片

    emit imagepass(imageblink);

}

其中:

QRectF targetf(15,145,162.5,91);//在前界面中显示大小的尺寸,前两个值是图片左上角的初始坐标值,之后是长和宽
    QRectF sourcef(0,0,500,280);//源文件图片需要显示的大小
    QImage iamgef;
    iamgef.load("C:/Users/Administrator/Desktop/w1.jpg");//打开指定目录的照片
    p.drawImage(targetf,iamgef,sourcef);//起始坐标,需要置入的照片

为打开未添加到【资源】中图片的方法。

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值