QT按钮点击切换QLineEdit焦点(含代码)

正常来说,点击QLineEdit控件后,焦点就进入该控件,可以进行键盘文字输入了。但某些场合可能需要通过按钮来点击,切换焦点所处的QLineEdit,如图
在这里插入图片描述
通过点击按钮,切换焦点所在的控件,这是下面讨论的问题

好,首先要明白QLineEdit的两个接口,setFocus();和hasFocus();,前者是设置焦点,能将焦点切换到具体的QLineEdit,后者是获取焦点,返回bool值。

一开始的想法是,通过遍历获取当前QLineEdit的焦点标志,判断按钮点击后要对哪一个QLineEdit设置焦点。但问题是,点击按钮的那一刻,会将焦点切换到按钮本身上,从而导致所有的QLineEdit都失去了焦点。

所以,我们需要在QLineEdit处于焦点的时候,外部对其有一个记录,以免像上面这样被覆盖。因此,QLineEdit需要自定义一下,这里在它的focusInEvent事件中重载一下。

mylineedit.h

#ifndef MYLINEEDIT_H
#define MYLINEEDIT_H

#include <QLineEdit>
#include <QDebug>


class myLineEdit : public QLineEdit
{
    Q_OBJECT

public:
    myLineEdit(QWidget *parent = nullptr);
    ~myLineEdit();

    void set_num(int num_);

protected:
    void focusInEvent(QFocusEvent *) override;
    int num = -1;

signals:
    void sig_lineedit_num(int num);

};

#endif // MYLINEEDIT_H

mylineedit.cpp

#include "mylineedit.h"

myLineEdit::myLineEdit(QWidget *parent) : QLineEdit(parent)
{

}

myLineEdit::~myLineEdit()
{

}

void myLineEdit::set_num(int num_)
{
    num = num_;
}

//焦点进入时响应
void myLineEdit::focusInEvent(QFocusEvent *e)
{
    emit sig_lineedit_num(num);//发送信号

    QLineEdit::focusInEvent(e);//正常处理焦点接收事件
}

通过set_num我们可以对QLineEdit都设置一个标志,在focusInEvent焦点进入时,信号返回该标志,从而在外部响应并记录

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();

    int flag = -1;//记录当前焦点的QLineEdit编号(自己设置)

private slots:
    void on_pushButton_clicked();

    void slot_lineedit_num(int num);


private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //连接信号槽
    connect(ui->lineEdit,SIGNAL(sig_lineedit_num(int)),this,SLOT(slot_lineedit_num(int)));
    connect(ui->lineEdit_2,SIGNAL(sig_lineedit_num(int)),this,SLOT(slot_lineedit_num(int)));
    connect(ui->lineEdit_3,SIGNAL(sig_lineedit_num(int)),this,SLOT(slot_lineedit_num(int)));

    //设置控件编号
    ui->lineEdit->set_num(0);
    ui->lineEdit_2->set_num(1);
    ui->lineEdit_3->set_num(2);

    //初始默认其中一个设置为焦点
    ui->lineEdit->setFocus();
}

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

//切换焦点
void MainWindow::on_pushButton_clicked()
{
    if(flag == 0)
    {
        flag = 1;
        ui->lineEdit_2->setFocus();
    }else if(flag == 1)
    {
        flag = 2;
        ui->lineEdit_3->setFocus();
    }else if(flag == 2)
    {
        flag = 0;
        ui->lineEdit->setFocus();
    }

    ui->lineEdit_2->hasFocus();
}

//槽函数接受响应编号,记录下来
void MainWindow::slot_lineedit_num(int num)
{
    qDebug()<<"shoudao num"<<num;
    flag = num;
}

在slot_lineedit_num中记录编号,在on_pushButton_clicked的按钮响应中根据编号进行setFocus的切换,从而达到我们的目的。

这里还设计到按钮自定义的提升,即在ui界面中对QLineEdit提升为myLineEdit,非常简单,不懂的同学再自己百度吧。

要在 QGraphicsView 中添加 QLineEdit 和一个 Qt 软键盘,你需要创建一个自定义的 QGraphicsView 类,并在其构造函数中添加 QLineEdit 和软键盘。 以下是一个示例代码片段,演示如何在 QGraphicsView 中添加 QLineEdit 和软键盘: ```python from PyQt5.QtWidgets import QGraphicsScene, QGraphicsView, QGraphicsProxyWidget, QLineEdit, QWidget, QVBoxLayout, QPushButton from PyQt5.QtGui import QKeyEvent class MyGraphicsView(QGraphicsView): def __init__(self): super().__init__() # 创建一个 QGraphicsScene 对象 self.scene = QGraphicsScene() self.setScene(self.scene) # 创建一个 QLineEdit 对象 self.line_edit = QLineEdit() self.line_edit.setPlaceholderText("Click to enter text") # 创建一个软键盘 widget self.keyboard_widget = QWidget() self.keyboard_layout = QVBoxLayout() self.keyboard_widget.setLayout(self.keyboard_layout) # 添加按钮到软键盘 widget self.btns = [] for i in range(10): btn = QPushButton(str(i)) btn.clicked.connect(lambda ch, i=i: self.line_edit.insert(str(i))) self.btns.append(btn) self.keyboard_layout.addWidget(btn) # 创建一个 QGraphicsProxyWidget 对象,并将 QLineEdit 设置为其 widget 属性 self.proxy_widget = QGraphicsProxyWidget() self.proxy_widget.setWidget(self.line_edit) # 将 QGraphicsProxyWidget 对象添加到 QGraphicsScene 中 self.scene.addItem(self.proxy_widget) def keyPressEvent(self, event: QKeyEvent) -> None: if event.key() == Qt.Key_Tab: if self.line_edit.hasFocus(): self.line_edit.clearFocus() self.keyboard_widget.setFocus() else: self.line_edit.setFocus() self.keyboard_widget.clearFocus() def showEvent(self, event) -> None: super().showEvent(event) # 将软键盘 widget 添加到 QGraphicsScene 中 self.keyboard_proxy_widget = QGraphicsProxyWidget() self.keyboard_proxy_widget.setWidget(self.keyboard_widget) self.scene.addItem(self.keyboard_proxy_widget) # 设置软键盘位置 keyboard_pos = self.mapToGlobal(self.line_edit.pos() + self.line_edit.rect().bottomLeft()) self.keyboard_proxy_widget.setPos(self.mapFromGlobal(keyboard_pos)) # 隐藏软键盘 widget self.keyboard_widget.hide() def focusOutEvent(self, event) -> None: super().focusOutEvent(event) # 隐藏软键盘 widget self.keyboard_widget.hide() def focusInEvent(self, event) -> None: super().focusInEvent(event) # 显示软键盘 widget self.keyboard_widget.show() # 创建一个 MyGraphicsView 对象,并显示它 view = MyGraphicsView() view.show() ``` 这将在 QGraphicsView 中添加一个 QLineEdit 和一个软键盘,你可以通过单击 QLineEdit 输入文本,通过 Tab 键切换焦点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值