有些时候,我们需要在自己的类中重写 XXXEvent() 这个虚函数,就像下面这样:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
protected:
virtual void mousePressEvent(QMouseEvent*);
};
以mousePressEvent()鼠标点击函数为例,我们的需求是这样的:如果是鼠标左键点击,那么做相关处理;如果是右键,则什么都不做。那么函数应该这么写:
void MainWindow::mousePressEvent(QMouseEvent* e)
{
//Qt事件类中的accepted值默认是true的,也就是说如果我们想接收某个事件,不用调用accept(),除非说之前调用了ignore()
if(e->button() == Qt::LeftButton)
{
//接受这个事件,并做一些处理...
}
else
{
//默认是调用父类的mousePressEvent(),既然我们不想处理,那就按照默认的方法好了
QWidget::mousePressEvent(e);
}
}
一般来说,父类QWidget里的XXXEvent()函数内容大多是忽略这个事件( 即e->ignore() ) ,然后可能会有一些额外的操作什么的,结束后然后再传到父组件那里。如果你直接用e->ignore()的话,那就相当于没有做父类XXXEvent()里面的额外的操作而直接传到父组件那里了,这样有可能会带来一些问题。
所以大多数时候,如果你自己的XXXEvent()函数里不想处理,那就调用父类的相应函数来做默认的处理,这样比较保险。
但有些时候比较特殊,比如closeEvent()。当我们点击关闭按钮时,QWidget::close()函数会发出一个QCloseEvent事件,然后最终如果这个事件被接收了的话,则关闭窗口,否则就什么都不做。
而QWidget::closeEvent()里是调用e->accept(),即默认是关闭窗口,而event类的accepted值又是默认为true的,所以如果我们不想关闭窗口,就必须调用e->ignore(),像这样:
void MainWindow::closeEvent(QCloseEvent* e)
{
int choose = QMessageBox::warning(this,"warning!","are you sure you want to quit?", QMessageBox::Yes | QMessageBox::No,QMessageBox::No);
//如果用户点击了Yes,那么窗口就会关闭
if(choose == QMessageBox::Yes)
e->accept();
else
e->ignore();
}
当然,具体实现时你的XXXEvent()函数可能会采用其他的一些方式,有可能你会先会在自己的XXXEvent()函数里做一些操作,然后再调用父类的XXXEvent()。有时候你也可以在这个组件的父组件类里的XXXEvent()里作一些操作。
Qt事件详细学习:
Qt学习之路:事件,事件的接收与忽略
Qt中事件处理的方法和实例