c++ - 从屏幕小键盘上获取输入时激活特定的 LineEdit
问题描述
我正在 qt 中制作一个登录表单,其中输入来自数字键盘。小键盘是在屏幕上创建的。当我尝试从小键盘获取输入时,它会在两个 lineEdit 字段中输入。那么如何在从数字键盘获取输入的同时将这两者分开呢?
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mainscreen.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->dB1,SIGNAL(released()),this,SLOT(display()));
connect(ui->dB2,SIGNAL(released()),this,SLOT(display()));
connect(ui->dB3,SIGNAL(released()),this,SLOT(display()));
connect(ui->dB4,SIGNAL(released()),this,SLOT(display()));
connect(ui->dB5,SIGNAL(released()),this,SLOT(display()));
connect(ui->dB6,SIGNAL(released()),this,SLOT(display()));
connect(ui->dB7,SIGNAL(released()),this,SLOT(display()));
connect(ui->dB8,SIGNAL(released()),this,SLOT(display()));
connect(ui->dB9,SIGNAL(released()),this,SLOT(display()));
connect(ui->dB0,SIGNAL(released()),this,SLOT(display()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::display()
{
QPushButton *qp=(QPushButton*)sender();
ui->lineEdit->setText(ui->lineEdit->text()+qp->text());
ui->lineEdit_2->setText(ui->lineEdit_2->text()+qp->text());
}
void MainWindow::on_pushButton_clicked()
{
QString username=ui->lineEdit->text();
QString password=ui->lineEdit_2->text();
if(username=="text"&&password=="text")
{
hide();
main_scn=new MainScreen();
main_scn->setWindowFlags(Qt::Window|Qt::FramelessWindowHint);
main_scn->show();
}
}
用户界面在这里,请检查一下
解决方案
以这种方式创建小键盘很不方便,因为它会将文本放置在两个 QLineEdit 中,并且通常用户名和密码并不总是相同的。
我的建议是创建一个不需要通过信号连接的 Numpad,但会发送一个事件,以便获得焦点的小部件。
numpadwidget.h
#ifndef NUMPADWIDGET_H
#define NUMPADWIDGET_H
#include <QApplication>
#include <QGridLayout>
#include <QKeyEvent>
#include <QToolButton>
#include <QWidget>
class NumpadWidget : public QWidget
{
Q_OBJECT
public:
explicit NumpadWidget(QWidget *parent = nullptr) : QWidget(parent)
{
QGridLayout *lay = new QGridLayout(this);
const std::vector<QPair<QString, int>> values{{"1", Qt::Key_1}, {"2", Qt::Key_2}, {"3", Qt::Key_3},
{"4", Qt::Key_4}, {"5", Qt::Key_5}, {"6", Qt::Key_6},
{"7", Qt::Key_7}, {"8", Qt::Key_8}, {"9", Qt::Key_9},
{".", Qt::Key_Colon}, {"0", Qt::Key_0}, {"*", Qt::Key_Asterisk}};
int i = 0;
int j = 0;
for(const QPair<QString, int> & value : values){
QToolButton *button =new QToolButton;
button->setText(value.first);
button->setFixedSize(40,40);
lay->addWidget(button, i, j);
button->setProperty("text", value.first);
button->setProperty("key", value.second);
connect(button, &QToolButton::clicked, this, &NumpadWidget::onClicked);
j++;
if(j % 3 == 0){
j=0;
i++;
}
}
setFixedSize(sizeHint());
}
private slots:
void onClicked()
{
if(QWidget *widget = QApplication::focusWidget()){
QString text = sender()->property("text").toString();
int key = sender()->property("key").toInt();
QKeyEvent * event = new QKeyEvent(QEvent::KeyPress, key, Qt::NoModifier, text);
QCoreApplication::postEvent(widget, event);
}
}
};
#endif // NUMPADWIDGET_H
然后提升 NumpadWidget 以便它可以在 Qt Designer 中使用,在下面的链接中它指示了如何做到这一点
完整的项目可以在以下链接中找到。
推荐阅读
- google-apps-script - 对分组的行范围进行排序 - Google 表格
- spring - 每 2 小时启动一次 @Scheduled(cron)
- javascript - 使用 require js 加载 Angular8 构建文件
- python - 即使当前队列包含未处理的元素,如何在 python 中通知 queue.join() 以停止阻塞?
- php - 如何在子域之间共享会话变量,除了一个
- python - 计算python中每n行数据帧的最大值/最小值
- angular - 如何使用角度的动态数据在高图表中钻取?
- python - 如何检查变量是否是联合中一种类型的实例?
- python - docker容器内的SSH密钥
- vue.js - 在 Vue 中处理选项选择表单中的数据