QT --- Qt实现tab键的*切换【事件过滤实现】
程序员文章站
2022-06-16 10:20:20
背景:qt在ui界面是默认打开tab键切换的,并且可以通过UI界面界面调整tab切换控件的顺序,但我们在自己设计界面时,具体应用场景多是tab在某几个控件进行切换,那么如何实现呢?这里通过为控件安装事件过滤器的方法进行实现。mainwindow.h#ifndef MAINWINDOW_H#define MAINWINDOW_H#include QT_BEGIN_NAMESPACEnamespace Ui { class MainWindow;...
背景:qt在ui界面是默认打开tab键切换的,并且可以通过UI界面界面调整tab切换控件的顺序,但我们在自己设计界面时,具体应用场景多是tab在某几个控件进行切换,那么如何实现呢?
这里通过为控件安装事件过滤器的方法进行实现。
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
bool eventFilter(QObject *obj, QEvent *event);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QKeyEvent>
#include <QDialog>
//#include <QEvent>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->lineEdit->installEventFilter(this);
ui->lineEdit_2->installEventFilter(this);
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if(obj == ui->lineEdit || obj == ui->lineEdit_2)
{
if(event->type() == QEvent::KeyPress)
{
//将事件转化为键盘事件
QKeyEvent *key_event = static_cast<QKeyEvent *>(event);
//按下Tab键执行焦点切换事件
if(key_event->key() == Qt::Key_Tab)
{
bool l1 = ui->lineEdit->hasFocus();
bool l2 = ui->lineEdit_2->hasFocus();
if(l1)
{
focusNextChild(); //切换到下一个
ui->lineEdit->setFocusPolicy(Qt::StrongFocus);
}
else if(l2)
{
focusPreviousChild(); //切换到上一个
ui->lineEdit_2->setFocusPolicy(Qt::StrongFocus);
}
return true;
}
}
// return MainWindow::eventFilter(obj, event);
}
}
MainWindow::~MainWindow()
{
delete ui;
}
QT的UI界面如下:
运行程序可以发现,tab键只会在我们设置的两个lineEdit控件间进行切换!
本文地址:https://blog.csdn.net/weixin_42445727/article/details/107645219