利用重写LineEdit 然后监听鼠标点击事件,根据LineEdit 的选择控制是数字键盘还是英文数字混合键盘。
实现方式非常的简单
只需要遍历所有的按键然后绑定槽函数
void keyboardNumDialog::init()
{
// this->setWindowFlags(Qt::FramelessWindowHint);
// this->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
setWindowModality(Qt::WindowModal);//半阻塞模式
QList<QPushButton *> btn = this->findChildren<QPushButton *>();
foreach (QPushButton * b, btn) {
connect(b, SIGNAL(clicked()), this, SLOT(btn_clicked()));
}
}
特殊按键单独处理,如果是数值直接将显示的内容添加到编辑框上就行了
void keyboardNumDialog::btn_clicked()
{
QPushButton *btn = (QPushButton *)sender();
if(btn == ui->pb_close){
this->reject();
return ;
}
if(btn == ui->pb_enter)
{
this->accept();
return ;
}
if(btn == ui->pb_delete)
{
delOneValue();
return ;
}
QString objectName = btn->text();
addChar(objectName);
}
LineEdit部分
继承这个控件然后重写鼠标松开事件
然后再界面上提升控件 就可以了
直接监听鼠标单击事件(这样把自己坑了,监听鼠标事件不能监听按下事件要监听松开事件,因为按下以后需要和松开同步使用的,这样操作会导致第一次点击输入法无效)
因为数字输入操作比较频繁,这里改成单例
void LineEditInput::mouseReleaseEvent(QMouseEvent * )
{
qDebug()<<this->inputMethodHints()<<" ";
if(this->inputMethodHints() == Qt::ImhPreferNumbers)
{
keyboardNumDialog *input = keyboardNumDialog::GetInstance();
input->setInputType(QLineEdit::Normal);
input->initValue(this->text());
// keyboardNumDialog *input = bn(this->text());
if(input->exec() == QDialog::Accepted)
{
this->setText(input->getValue());
}
else
{
}
input->close();
}
else if(this->inputMethodHints() == Qt::ImhHiddenText)
{
keyboardEnDialog input(this->text());
if(input.exec() == QDialog::Accepted)
{
this->setText(input.getValue());
}
else
{
}
}
else if(this->echoMode() == QLineEdit::Password)
{
keyboardNumDialog *input = keyboardNumDialog::GetInstance();
input->initValue(this->text());
input->setInputType(QLineEdit::Password);
// keyboardNumDialog *input = bn(this->text());
if(input->exec() == QDialog::Accepted)
{
this->setText(input->getValue());
}
else
{
}
input->close();
}
else
{
// ErrorMessage(tr("Error"),tr("未设置输入类型"));
}
}
然后就可以通过Qt Creator UI编辑器中的
通过选择这两个的其中一个就可以切换数字键盘或者是英文键盘了
https://download.csdn.net/download/weixin_42193704/12759297 完整工程下载链接