1.继承QlineEdit重写void mousePressEvent(QMouseEvent *event);事件。
头文件
#ifndef MY_LINEEDIT_H
#define MY_LINEEDIT_H
#include <QWidget>
#include <QLineEdit>
class My_lineEdit : public QLineEdit
{
Q_OBJECT
public:
My_lineEdit(QWidget *parent = 0);
protected:
void mousePressEvent(QMouseEvent *event);
signals:
void send_show(QString data);//建议:此处的参数可以添加一个对象名称
};
#endif // MY_LINEEDIT_H
cpp文件
#include "my_lineedit.h"
My_lineEdit::My_lineEdit(QWidget *parent) :
QLineEdit(parent)
{
this->setText("");
}
void My_lineEdit::mousePressEvent(QMouseEvent *event)
{
emit send_show(this->text());
QLineEdit::mousePressEvent(event);
}
2.添加myKeyBoardDialog界面类
h文件
#ifndef MYKEYBOARDDIALOG_H
#define MYKEYBOARDDIALOG_H
#include <QDialog>
namespace Ui {
class myKeyBoardDialog;
}
class myKeyBoardDialog : public QDialog
{
Q_OBJECT
public:
explicit myKeyBoardDialog(QWidget *parent = nullptr);
~myKeyBoardDialog();
private slots:
void on_okBtn_clicked();
void on_btn0_clicked();
void on_btn1_clicked();
void on_btn2_clicked();
void on_btn3_clicked();
void on_btn4_clicked();
void on_btn5_clicked();
void on_btn6_clicked();
void on_btn7_clicked();
void on_btn8_clicked();
void on_btn9_clicked();
void on_btnDot_clicked();
void on_btnDel_clicked();
signals:
void sendKeyBoardUIDataToLineEdit(QString);
private:
Ui::myKeyBoardDialog *ui;
};
#endif // MYKEYBOARDDIALOG_H
cpp文件
#include "mykeyboarddialog.h"
#include "ui_mykeyboarddialog.h"
myKeyBoardDialog::myKeyBoardDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::myKeyBoardDialog)
{
ui->setupUi(this);
}
myKeyBoardDialog::~myKeyBoardDialog()
{
delete ui;
}
void myKeyBoardDialog::on_okBtn_clicked()
{
//传递数据至lineEdit
emit sendKeyBoardUIDataToLineEdit(ui->lineEdit->text());
this->close();
}
void myKeyBoardDialog::on_btn0_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"0");
}
void myKeyBoardDialog::on_btn1_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"1");
}
void myKeyBoardDialog::on_btn2_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"2");
}
void myKeyBoardDialog::on_btn3_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"3");
}
void myKeyBoardDialog::on_btn4_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"4");
}
void myKeyBoardDialog::on_btn5_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"5");
}
void myKeyBoardDialog::on_btn6_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"6");
}
void myKeyBoardDialog::on_btn7_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"7");
}
void myKeyBoardDialog::on_btn8_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"8");
}
void myKeyBoardDialog::on_btn9_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"9");
}
void myKeyBoardDialog::on_btnDot_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+".");
}
void myKeyBoardDialog::on_btnDel_clicked()
{
QString text = ui->lineEdit->text();
ui->lineEdit->setText(text.remove(text.length()-1,1));
}
3.mainwindow添加lineEdit控件并提升为My_lineEdit
h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include"mykeyboarddialog.h"
#include"my_lineedit.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
void show_numberkeyboard_ui(QString data); //显示键盘
void confirmString(QString gemfield); //接收键盘发过来的数据
private:
Ui::MainWindow *ui;
myKeyBoardDialog *numberkeyboard;
QKeyEvent *event;
};
#endif // MAINWINDOW_H
cpp文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
numberkeyboard = new myKeyBoardDialog();
//将所有lineedit信号都和软件盘界面显示关联
connect(ui->lineEdit,SIGNAL(send_show(QString)),this,SLOT(show_numberkeyboard_ui(QString)));
connect(numberkeyboard,SIGNAL(sendKeyBoardUIDataToLineEdit(QString)),this,SLOT(confirmString(QString)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::show_numberkeyboard_ui(QString str)
{
ui->lineEdit->setText(str);
numberkeyboard->exec();
}
void MainWindow::confirmString(QString gemfield)
{
ui->lineEdit->setText(gemfield);
}
4.截图
1-2.也可以通过 过滤 MousePressEvent 事件来完成 点击 QLineEdit 调用软键盘
bool eventFilter(QObject *watched, QEvent *event);
void callKeyBoard();
ui->lineEdit_kv->installEventFilter(this) ;
// 事件过滤器函数重写
bool init::eventFilter(QObject *watched, QEvent *event)
{
if ( (watched == ui->lineEdit_kv) && (event->type() == QEvent::MouseButtonPress) )
{
callKeyBoard();
}
return QWidget::eventFilter(watched,event);
}
// 调用软键盘
void init::callKeyBoard()
{
ui->widget_bort->show() ;
}
5.源码链接
https://download.csdn.net/download/weixin_41882459/12728524
6.建议:
a.如果窗体中有多个lineEdit,可以在My_lineEdit文件的send_show中的参数中增加this->objectName,在对应的槽函数中获取对象名称,在confirmString显示函数中,如下操作
this->findChild<QLineEdit *>(this->objectName)->setText(text);
样式设置
QPushButton {
background: #4395ff;
border-radius: 5px;
margin: 5px;
font-size: 26px;
color: white;
}
QPushButton:pressed { background: #01ddfd }
QPushButton:hover{background:#01EEFF}
QLineEdit
{
border-style: none;
padding: 3px;
border-radius: 5px;
border: 1px solid #dce5ec;
font-size: 30px;
}
b.建议居中显示
c.建议单例模式
d.dialog的边框需要去掉,窗体的样式需要自己去调整。