事件(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 }