事件重写
QT界面的每一个操作都是一个事件,这些事件会发送相应的信号,之前只是去绑定这些信号,然后触发我们自定义的槽函数。
但是,还有一些操作本身就有默认的处理,比如点击"MainWindow"窗口的关闭按钮,那么窗口被关闭,程序停止,如果需要在单击关闭按钮之后,弹出一个dialog来提示用户是否真的关闭,该怎么实现?——事件重写
1、找到事件函数的名字,重写哪个函数?
关闭按钮,是窗口的基本功能,——QWidget
1 //改写关闭窗口的按钮事件函数 2 void MainWindow::closeEvent(QCloseEvent *event){ 3 int ret = QMessageBox::question(this,"确定","真的关闭吗?","确定","取消"); 4 if(ret == 1){ //取消 5 event->ignore(); 6 } 7 }
定义场景的点击事件:
场景是由16个图元构成的,当点击老鼠时,实际上只是点击了某个图元,如果是场景的点击事件,那么在任意位置点击,都会当做是触发了点击事件,不管是否打到老鼠。
所以,需要重写的是图元的点击事件——确定重写谁的点击事件。
事件,一般情况下都是protected属性的,并且不是所有的控件,都是直接去写QWidget中的事件函数,首先应该看控件直接父类,父类追溯到QWidget父类时,才去重写其事件函数。
1 #ifndef MYITEM_H 2 #define MYITEM_H 3 #include <QGraphicsPixmapItem> 4 5 class myitem : public QGraphicsPixmapItem 6 { 7 public: 8 myitem(); 9 void setPic(QString src); 10 }; 11 12 #endif // MYITEM_H
当前图元的父类——QGraphicsPixmapItem,查看帮助文档,看是否存在点击事件
1 virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event) 3 virtual void mousePressEvent(QGraphicsSceneMouseEvent *event) //鼠标按下 5 virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) //鼠标抬起
这里选用鼠标按下函数来重写:为了判断是否真正打到老鼠,需要在图元中增加一个老鼠标识,当置换为老鼠图片时,需要更新这个标识为有老鼠的状态,然后当重写单击时,先去判断一下当前图元是否为有老鼠的属性。
1 #ifndef MYITEM_H 2 #define MYITEM_H 3 #include <QGraphicsPixmapItem> 4 5 class myitem : public QGraphicsPixmapItem 6 { 7 public: 8 myitem(); 9 void setPic(QString src); 10 11 virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); 12 13 void setmouse(bool mouse); //设置老鼠标识 14 bool ismouse(); //读取老鼠标识 15 private: 16 bool mouse; //标识图元是否老鼠图元 17 18 }; 19 20 #endif // MYITEM_H
1 #include "myitem.h" 2 #include <QPixmap> 3 #include <QDebug> 4 5 myitem::myitem() 6 { /* 7 void setPixmap(const QPixmap &pixmap); 8 绑定图片到图元 9 */ 10 this->setPixmap(QPixmap(":/mouse/pic/bg1.png")); 11 } 12 13 //重新设置图片,从而实现更换图片的效果 14 void myitem::setPic(QString src){ 15 this->setPixmap(src); 16 } 17 18 void myitem::setmouse(bool mouse){ 19 this->mouse = mouse; 20 } 21 22 bool myitem::ismouse(){ 23 return this->mouse; 24 } 25 26 void myitem::mousePressEvent(QGraphicsSceneMouseEvent *event){ 27 //判断当前是否是老鼠 28 if(this->ismouse()){ 29 qDebug()<<"打到老鼠"; 30 }else{ 31 qDebug()<<"未打到老鼠"; 32 } 33 }
1 #include "myscene.h" 2 3 #include <stdlib.h> 4 #include <time.h> 5 6 MyScene::MyScene(QObject *parent) : QGraphicsScene(parent) 7 { 8 9 //添加图元到场景 10 for(int i = 0;i<16;i++){ 11 this->item[i] = new myitem(); 12 //设置坐标 13 /*一维数组转换为二维数组,下面宽、高的倍数组合 14 0 0,0 1,0 2,0 3 15 1 0,1 1,1 2,1 3 16 2 0,2 1,2 2,2 3 17 3 0,3 1,3 2,3 3 18 */ 19 double x = i/4 * this->item[i]->boundingRect().width(); 20 double y = i%4 * this->item[i]->boundingRect().height(); 21 this->item[i]->setPos(x,y); 22 this->addItem(this->item[i]); 23 } 24 25 //绑定一个定时器,等定时周期到触发一个随机数[0-15],然后让场景中的一个图元的图片更换 26 this->p_timer = new QTimer(); 27 connect(this->p_timer, SIGNAL(timeout()), this, SLOT(update_my_item())); //绑定定时器和槽函数 28 this->p_timer->start(1000); //1s 29 30 } 31 32 MyScene::~MyScene(){ 33 for(int i = 0;i<16;i++){ 34 delete this->item[i]; 35 } 36 delete this->p_timer; 37 } 38 39 40 void MyScene::update_my_item(){ 41 //每次出现老鼠之前,先恢复到所有图元为无老鼠的样式图片 42 for(int i = 0;i<16;i++){ 43 this->item[i]->setPic(":/mouse/pic/bg1.png"); 44 45 //同时需要恢复图元老鼠标识为默认 46 this->item[i]->setmouse(false); 47 } 48 49 srand(time(NULL)); //设置随机数种子 50 51 //一次性允许显式最多三个老鼠 52 int count = rand()%3 +1; 53 for(int k=1;k<=3;k++){ 54 int i = rand()%16; 55 this->item[i]->setPic(":/mouse/pic/mouse.png"); 56 57 //同时需要设置图元老鼠标识 58 this->item[i]->setmouse(true); 59 } 60 }
原文:https://www.cnblogs.com/data1213/p/10851329.html