事件过滤器

dialog.h

#include <QDialog>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

protected:
    bool eventFilter(QObject *obj, QEvent *event);

private:
    Ui::Dialog *ui;
};

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

#include <QKeyEvent>
#include <QDateTime>

#pragma execution_character_set("utf-8")

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    
    ui->recordName->setFocus();

    // 安装事件过滤器
    ui->recordName->installEventFilter(this);
    ui->archiveCheckComboBox->installEventFilter(this);
    ui->remarks->installEventFilter(this);
    ui->createNewTraceBtn->installEventFilter(this);
    ui->coverOldTraceBtn->installEventFilter(this);
    ui->cancle->installEventFilter(this);
}

Dialog::~Dialog()
{
    delete ui;
}


bool Dialog::eventFilter(QObject *obj, QEvent *event)
{
    if( obj == ui->recordName || obj == ui->archiveCheckComboBox || obj == ui->remarks
            || obj == ui->createNewTraceBtn || obj == ui->coverOldTraceBtn || obj == ui->cancle )
    {
        if( event->type() == QEvent::KeyPress )
        {
            //将事件转化为键盘事件
            QKeyEvent *key_event = static_cast< QKeyEvent* >( event );

            //按下回车键执行焦点切换事件
            if( key_event->key() == Qt::Key_Return )
            {
                bool recordName_focus           = ui->recordName->hasFocus();
                bool archiveCheckComboBox_focus = ui->archiveCheckComboBox->hasFocus();
                bool remarks_focus              = ui->remarks->hasFocus();
                bool createNewTraceBtn_focus    = ui->createNewTraceBtn->hasFocus();
                bool coverOldTraceBtn_focus     = ui->coverOldTraceBtn->hasFocus();
                bool cancle_focus               = ui->cancle->hasFocus();

                if( recordName_focus )
                {
                    focusNextChild();
                    ui->archiveCheckComboBox->setFocus();
                }
                else if( archiveCheckComboBox_focus )
                {
                    focusNextChild();
                    ui->remarks->setFocus();
                }
                else if( remarks_focus )
                {
                    focusNextChild();
                    ui->createNewTraceBtn->setFocus();
                }
                else if( createNewTraceBtn_focus )
                {
                    focusNextChild();
                    ui->coverOldTraceBtn->setFocus();
                }
                else if( coverOldTraceBtn_focus )
                {
                    focusNextChild();
                    ui->cancle->setFocus();
                }
                else if( cancle_focus )
                {
                    focusNextChild();
                    ui->recordName->setFocus();
                }
                else
                {
                    focusNextChild();
                }

                return true;
            }
        }
    }

    return QDialog::eventFilter( obj, event );
}

注:子控件响应事件的两种方法:
1.在父类中安装子类的事件监听器。
2.重写子类相关事件。
另外,如果不想让子控件接收某个事件,可重写子类相关事件,其函数内容什么操作也不做,或者用event->ignore()忽略该事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值