QT学习笔记6

事件(event)

一般来说,使用Qt编程时,我们并不会把主要精力放在事件上,因为在Qt中,需要我们关心的事件总会发出一个信号。比如,我们关心的是QPushButton的鼠标点击,但我们不需要关心这个鼠标点击事件,而是关心它的clicked()信号。这与其他的一些框架不同:在MFC中,你所要关心的是鼠标左键按下这个事件。总的来说,如果我们使用组件,我们关心的是信号槽;如果我们自定义组件,我们关心的是事件。因为我们可以通过事件来改变组件的默认操作。比如,如果我们要自定义一个QPushButton,那么我们就需要重写它的鼠标点击事件和键盘处理事件,并且在恰当的时候发出clicked()信号。

 1 #include "mainwindow.h"
 2 #include <QtGui/QApplication>
 3 
 4 #include <QMouseEvent> 
 5 
 6 class EventLabel:public QLabel
 7 {
 8 protected:
 9     void mouseMoveEvent(QMouseEvent *ev);
10     void mousePressEvent(QMouseEvent *ev);
11     void mouseReleaseEvent(QMouseEvent *ev);
12     
13 };
14 
15 void EventLabel::mouseMoveEvent(QMouseEvent *ev)
16 {
17     this->setText(QString("<center><h1>Move: (%1, %2)</h1></center>") 
18         .arg(QString::number(ev->x()), QString::number(ev->y()))); 
19 }
20 
21 void EventLabel::mousePressEvent(QMouseEvent *ev)
22 {
23    QString text;
24    text.sprintf("<center><h1>Move: (%d, %d)</h1></center>",ev->x(),ev->y());
25    this->setText(text);
26 }
27 
28 void EventLabel::mouseReleaseEvent(QMouseEvent *ev)
29 {
30     this->setText(QString("<center><h1>Move: (%1, %2)</h1></center>").arg(QString::number(ev->x()),QString::number(ev->y())));
31 
32 }
33 
34 
35 int main(int argc, char *argv[])
36 {
37     QApplication a(argc, argv);
38     /*MainWindow w;
39     w.show();*/
40     EventLabel *eventLabel=new EventLabel;
41     eventLabel->setWindowTitle("my title");
42     eventLabel->resize(300,200);
43     eventLabel->show();
44     return a.exec();
45 }

运行结果:

忽略事件:判断点击的按钮是左键还是右键,忽略事件调用父类的响应函数即可。

 1 void EventLabel::mousePressEvent(QMouseEvent *ev)
 2 {
 3     if(ev->button() == Qt::RightButton) 
 4     {
 5         QString text;
 6         text.sprintf("<center><h1>Move: (%d, %d)</h1></center>",ev->x(),ev->y());
 7         this->setText(text);
 8     } else 
 9     {
10         QLabel::mousePressEvent(ev);
11     }
12 
13   
14 }

退出窗口选择:

 1 void MainWindow::closeEvent(QCloseEvent * event)
 2 {
 3     if(continueToClose()) 
 4     {
 5         event->accept();
 6     } else {
 7         event->ignore();
 8     }
 9 }
10 
11 bool MainWindow::continueToClose()
12 {
13     if(QMessageBox::question(this,
14         tr("Quit"),
15         tr("Are you sure to quit this application?"),
16         QMessageBox::Yes | QMessageBox::No,
17         QMessageBox::No)
18         == QMessageBox::Yes) {
19             return true;
20     } else {
21         return false;
22     }
23 }
原文地址:https://www.cnblogs.com/love6tao/p/5198860.html