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()忽略该事件。