有关Qt事件的接收与忽略的一些理解

有些时候,我们需要在自己的类中重写 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中事件处理的方法和实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值