Qt实训项目----(2)

本文详细介绍了在Qt项目中实现绘图区图片缩放功能的具体步骤,包括在主窗体工具栏添加放大缩小工具,通过鼠标事件调整图片大小,并确保图片不会无限缩小。文中提供了关键代码片段,如设置鼠标图标变化、重绘事件处理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt实训项目----(2)

1.在主窗体工具栏中添加放大、缩小工具;
2.点击工具后,在绘图区中由默认图标变换为相应的放大、缩小图标;
3.以缩小或放大图标所在绘图区位置为中心,实现绘图区图片的放大和缩小,要求:图片不能无限缩小。

任务1就不用说了,在上个章节里面已经添加了,放置的方法和上个项目放置工具的方法一样,都是拖入工具栏就行,这里就不再过多的描述了。

任务2:在网上下载相应的放大和缩小图片的相应资源
放大:zoomin
缩小:zoomout

在这里我们一定要记住,只要是有图片资源的,那就必须先实例化一个图片,不然无法加载。但是也别忘了在最上方添加头文件(我开始由于刚开始转行开始重学C++所以只要是基类我就给他添加一遍,这个方法绝对没有错误,但是后面如果东西多了可能会造成点问题!!!!)
好了,不多说了,上代码前一定要搞懂,图标变换是在哪一个函数周期内,就在功能开始的时候声明就行,最后恢复状态就好。

void MainWindow::on_actionZoomin_triggered()
{
    /* 这确实是加载图标的方式,为什么我们要解析呢,你要多
       读任务要求,任务要求我们在绘图区域内,如果我们这样
       设置就是在这个功能的过程之中。
    QCursor cursor_Zoomin;
    QPixmap pixmap_Zoomin(":/new/img/zoomin.png");
    cursor_Zoomin=QCursor(pixmap_Zoomin,-1,-1);
    setCursor(cursor_Zoomin);
    */
    _drawState=5;
}
void MainWindow::on_actionZoomout_triggered()
{
    /*
    QCursor cursor_Zoomout;
    QPixmap pixmap_Zoomout(":/new/img/zoomout.png");
    cursor_Zoomout=QCursor(pixmap_Zoomout,-1,-1);
    setCursor(cursor_Zoomout);
    */
    _drawState=6;
}

这就是我们设置的槽函数,在看重绘事件和点击事件中的函数,我只截图其中的部分了,就不做处理了;
点击事件mousePressEvent:

else if(_drawState==5)  //放大事件
        {
            _lpress=event->pos();  //左键点击的位置
            _point.append(_lpress);  //把所有左键点击的点添加到容器中
            central_point=_point.at(_point.size()-1);  //放大缩小的中心点
            _factor *=1.1;
            _dx=central_point.x()*(1-_factor);
            _dy=(central_point.y()-25)*(1-_factor);
            update();
        }
        else if(_drawState==6)  //缩小事件
        {
            _lpress=event->pos();
            _point.append(_lpress);
            central_point=_point.at(_point.size()-1);
            qDebug()<<"central_point:"<<central_point;
            //下面的计算我就不多说了,这是你数学基础的问题...
            _factor =_factor*0.9;
            _dx=central_point.x()*(1-_factor);
            _dy=(central_point.y()-30)*(1-_factor);
            
            if(_factor<=0.2)  //保证最小放大倍数
            {
                _factor=0.2;
            }
            update();
        }

这就是基本的实现函数,里面的容器还有全局变量需要自己去声明,我就不多说了。
下面看重绘事件paintEvent:

void MainWindow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    QPainter p(this);
    QPen pen(QColor(255,0,0));
//    QBrush brush(QColor(0,255,0,125));  //不需要画刷
    p.setPen(pen);
//    p.setBrush(brush);  //不需要画刷
    p.setRenderHint(QPainter::Antialiasing);
    
    //把图片绘制到绘图区域
    QPixmap pix;
    pix.load(":/new/img/earth.jpg");
    p.drawPixmap(0+_dx,rect.height()+_dy,
                     ui->centralWidget->width()*_factor,
                     ui->centralWidget->height()*_factor,pix)
}
    

这就是重绘事件,我也不多说了,其中的运算式,是需要我们计算出来的,是我们能看见的与放大缩小后图片的差距。

好了最重要的一步到来了,就是我们要如何设置在绘图区域内就是在我们的工具栏之下图标进行变换呢。这就需要我们捕捉鼠标的移动监听。那么有人就会问setMouseTracking(true); 为什么就不行呢?这里就多说一下,因为我们的工程基类是mainwindow,而setMouseTracking(true);设置监听的如果能实现,那么是在widget基类的窗体工程可以实现的,但是在mainwindow基类下就不行了,所以我们就需要多设置一步,ui->centralWidget->setMouseTracking(true); 因为我们的绘图区域就是widget基类的,我们设置了它接收监听事件就可以了,毕竟工具栏maintoolbat状态栏statusbar还有menubar是不接受鼠标监听的。如此我们就需要在构造函数里面添加

    ui->centralWidget->setMouseTracking(true);
    setMouseTracking(true);

这样就可以了,当然你不在构造函数里面添加,在鼠标移动事件我们判断的时候添加应该可以(我没试过,所以不好给你们确切的答案,可以自己去尝试一下)。
我们这就去看鼠标图标的变换的代码。
鼠标移动事件mouseMoveEvent:

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    qDebug()<<event;

   QCursor cursor_Zoomin,cursor_Zoomout;
    QPixmap pix1(":/new/img/zoomin.png"),
            pix2(":/new/img/zoomout.png");
    cursor_Zoomin=QCursor(pix1,-1,-1);
    cursor_Zoomout=QCursor(pix2,-1,-1);

    // 为什么25不行 ,26可以 !!!!
//    QRect eventRegion(0,25,
//                      this->centralWidget()->geometry().width(),
//                      this->centralWidget()->geometry().height());


    QRect eventRegion(0,rect.height()+1,
                      this->centralWidget()->geometry().width(),
                      this->centralWidget()->geometry().height());

    if(_drawState==5)
    {
        if(eventRegion.contains(event->pos()))
        {
            setCursor(cursor_Zoomin);
        }
        else
        {
            setCursor(Qt::ArrowCursor);
        }
    }
    else if(_drawState==6)
    {
        if(eventRegion.contains(event->pos()))
        {
            setCursor(cursor_Zoomout);
        }
        else
        {
            setCursor(Qt::ArrowCursor);
        }
    }
}

这里我也不知道为什么在工具栏高度的基础上+1才可以,但是不+1就不行。我查过没答案,所以就这样了。如果有知道的,可以在下面评论告诉我一下。谢谢了!!!

任务3其实在任务2的说明里面都已经包含了,自己可以分辨出来的。

如果有说明错误,希望大家可以指出来我在改正的同时也会感谢给我指出错误的人。也希望刚开始接触Qt的对你们有所帮助。很简单的功能。

切记:东西都是一点点的积累起来的,路也是一步步走的。基础扎实了干什么都好说,如果太过的好高骛远,你什么都不会学到的。

不多说,本人不大懂C,不能说教程到底怎么样,听说挺好的,为网传资源,资源过大上传乃是下载链接,不多说,下面上目录,行不行您自个儿看着办: 1.01-1-Qt讲解及Qt开发工具(编辑环境)讲解 2.01-2-登录界面布局讲解 3.01-3-登录界面功能介绍讲解: H# E. \' |0 {5 T 4.01-4-手动编写登录界面实现讲解: t# m, S# u7 e" t K. ? 5.01-5-手动编译qt源代码过程讲解 `+ }3 y$ y* r 6.01-6-手动实现信号与槽的连接过程4 M. l0 {# Q6 I& B/ G0 i- M1 L1 c 7.01-7-计算器实现思路讲解 8.02-1- 计算器功能的实现4 M) ?/ t H2 }: W/ I. T2 ^ 9.02-2- 对Qlabel的使用(图片,动画演示) 10.02-3-对apropressbon的使用 11.02-4- 对文本输入框的使用: o5 w4 j8 k( T$ z 12.03-1-多个窗体切换行* D4 u1 C, y- z 13.03-2-QTimer、Qlabel实现倒计时、动画播放+ B; L* k# v5 V6 a( i2 h- N) D 14.03-3-QmessageDialog、QcolorDialog# W+ I4 d4 G: `( I, k$ @4 _ 15.03-4-多个窗体切换(静态公共方法实现) 16.03-5-QFontDialog、QIapontDialog、Qpropr 17.04-1-QFileDialog、QFile、对文件操作 18.04-2-鼠标事件(单击、双击、移动) 19.04-3-绘图事件9 [' Z2 ^/ t# B" t6 V3 ] 20.04-4-绘图事件例子讲解; J! L7 z. I3 P 21.04-5-关闭事件、窗体大小改变事件) ~# |7 D3 S k' ]% l9 M' \ v 22.05-1-棋盘类背景绘制 23.05-2-棋盘类:画棋盘 24.05-3-棋盘类:画棋盘(2)9 [' z( T+ ]8 w# v 25.05-4-棋盘类:普通落子" U' K1 ~! W6 N; A8 P) J 26.05-5-棋盘:增加位点、增加界面 27.05-6-增加吃子规则 28.05-7-棋盘:实现人人对战 29.05-8-棋盘:实现人机对战( M7 U' T! ~4 b4 @8 q 30.06-1-记事本:界面设计 31.06-2-记事本:新建功能 32.06-3-记事本:打开功能0 `4 Y8 d9 u! `6 ?, e, r 33.06-4-记事本:保存、另存为、退出 34.06-5-编辑、帮助功能. x( I, m, H( k/ y9 S9 g 35.06-6-记事本:右键菜单功能 36.07-1-Qprocess开启新的进程 37.07-2-实现QTimer(用QThread) 38.07-3-窗体附属功能 39.07-4-播放器:界面设计, n: o. O, r2 A# r8 Z1 N1 D 40.07-5-播放器:播放功能, Z) i8 h9 S5 Z5 p! R* ^5 S) a: e 41.07-6-播放器:快进、后退、上一页、下一页、声音调节$ t% z" z y- z! ` 42.07-7-播放器:播放功能的完善7 I/ H* F! j/ e0 }4 f* q) D5 c 43.08-1-播放器:拖动播放0 ?0 u' w8 _3 x/ j) B 44.08-2-播放器:放大缩小 45.08-3-播放器:键盘放大缩小 46.08-4-文本框、按钮赋值& Q" x8 J/ G3 a# G/ ?$ B 47.08-5-QListwidpet值切换实现- B* \- l7 L6 Y K8 R 48.08-6-QListwidpet拖动改变值 49.09-1-dow方式对xml读、 50.09-2-dow方式对xml写9 E. Q5 j0 d2 j$ Q: K3 K0 `) Y6 F 51.09-3-stream方式对xml读* D/ S8 S% x; E' s% |. T/ ^ 52.09-4-stream方式对xml写 53.09-5-http请求实现$ Q: ?/ ~1 s- R 54.10-1-http请求获取文件 55.10-2-tcp服务器实现步骤(1) 56.10-3-tcp服务器实现步骤(2) 57.10-4-tcp客户端实现 58.10-5-tcp文件服务器实现 59.11-1- 60.11-2-: {, u9 U) u1 A! B/ B& D7 f 61.11-3-% p& {$ D" J) V# ?. N& `8 u5 o' s2 S" | 62.11-4- 63.12-1-黑白棋:服务器实现) o1 R4 }' k% C" P4 S) g 64.12-2-黑白棋:网络对战实现/ O3 }6 l0 S6 S% J2 |% ^/ [ 65.12-3-SQL对表操作 66.12-4-SQL对表数据操作. q: ]2 K& m9 e$ g S' y 67.12-5-SQL触发器 68.13-1-SQL综合使用(1) 69.13-2-SQL综合使用(2)& R" A5 B# X7 e' |# p+ b 70.13-3-SQL综合使用(3)* V/ M' C) ?: E 71.13-4-SQL综合使用(4) 72.13-5-表设计Qt界面(1) 73.13-6-表设计Qt界面(2) 74.13-7-Qt与SQLite数据库的操作 75.14-1-QTablemodel与SQLite关联. c7 s: Q" K) t+ r! V 76.14-2-SQLite操作:插入 77.14-3-SQLite操作:查询、执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值