From 49b1860afe26eb45392106fc04c7e6f4516f5f81 Mon Sep 17 00:00:00 2001
From: TianZD <1203886034@qq.com>
Date: Sat, 25 Apr 2026 16:33:53 +0800
Subject: [PATCH] modify
---
CMakeLists.txt | 31 +++++
NumKeyBoard.pro | 8 +-
NumKeyBoard.qrc | 6 +
NumKeyBoard_global.h | 12 ++
README.md | 69 +++-------
numkeydia.cpp | 295 +++++++++++++++++++++++--------------------
numkeydia.h | 50 +++++---
numkeydia.ui | 157 ++++++++---------------
8 files changed, 317 insertions(+), 311 deletions(-)
create mode 100644 CMakeLists.txt
create mode 100644 NumKeyBoard.qrc
create mode 100644 NumKeyBoard_global.h
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..02b1796
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,31 @@
+project(NumKeyBoard LANGUAGES CXX)
+
+set(NUMKEYBOARD_SOURCES
+ numkeydia.cpp
+ numkeydia.ui
+ NumKeyBoard.qrc
+)
+
+set(NUMKEYBOARD_HEADERS
+ numkeydia.h
+ NumKeyBoard_global.h
+)
+
+add_library(${PROJECT_NAME} SHARED
+ ${NUMKEYBOARD_SOURCES}
+ ${NUMKEYBOARD_HEADERS}
+)
+
+target_include_directories(${PROJECT_NAME} PUBLIC
+ ${CMAKE_CURRENT_SOURCE_DIR}
+)
+
+target_compile_definitions(${PROJECT_NAME} PRIVATE
+ NUMKEYBOARD_LIBRARY
+)
+
+target_link_libraries(${PROJECT_NAME} PUBLIC
+ Qt${QT_VERSION_MAJOR}::Core
+ Qt${QT_VERSION_MAJOR}::Gui
+ Qt${QT_VERSION_MAJOR}::Widgets
+)
diff --git a/NumKeyBoard.pro b/NumKeyBoard.pro
index 139d56a..58047c5 100644
--- a/NumKeyBoard.pro
+++ b/NumKeyBoard.pro
@@ -1,6 +1,8 @@
QT += core gui widgets
TEMPLATE = lib
+TARGET = NumKeyBoard
+DEFINES += NUMKEYBOARD_LIBRARY
CONFIG += c++17
@@ -12,12 +14,16 @@ OBJECTS_DIR = $$PWD/Build/objs
RCC_DIR = $$PWD/Build/resources
UI_DIR = $$PWD/Build/ui
-HEADERS += $$PWD/numkeydia.h
+HEADERS += \
+ $$PWD/NumKeyBoard_global.h \
+ $$PWD/numkeydia.h
SOURCES += $$PWD/numkeydia.cpp
FORMS += $$PWD/numkeydia.ui
+RESOURCES += $$PWD/NumKeyBoard.qrc
+
# Default rules for deployment.
unix {
target.path = /usr/lib
diff --git a/NumKeyBoard.qrc b/NumKeyBoard.qrc
new file mode 100644
index 0000000..276be73
--- /dev/null
+++ b/NumKeyBoard.qrc
@@ -0,0 +1,6 @@
+
+
+ ../../Res/Qss/commonWidget.qss
+ ../../Res/Images/keyboard.svg
+
+
diff --git a/NumKeyBoard_global.h b/NumKeyBoard_global.h
new file mode 100644
index 0000000..f76de20
--- /dev/null
+++ b/NumKeyBoard_global.h
@@ -0,0 +1,12 @@
+#ifndef NUMKEYBOARD_GLOBAL_H
+#define NUMKEYBOARD_GLOBAL_H
+
+#include
+
+#if defined(NUMKEYBOARD_LIBRARY)
+#define NUMKEYBOARD_EXPORT Q_DECL_EXPORT
+#else
+#define NUMKEYBOARD_EXPORT Q_DECL_IMPORT
+#endif
+
+#endif // NUMKEYBOARD_GLOBAL_H
diff --git a/README.md b/README.md
index a8c0f9e..e1dc2c1 100644
--- a/README.md
+++ b/README.md
@@ -1,66 +1,31 @@
-# 数字软键盘
+# NumKeyBoard
-## qmake作为pri使用
+`Libs/NumKeyBoard` is the shared numeric keyboard library used by both `TGcs` and `LauncherLib`.
-- 将文件夹复制到主工程Libs目录下
-- 主工程pro文件中加入:
+## qmake
+
+Build the library from `TGcsProject.pro` or `Libs/NumKeyBoard/NumKeyBoard.pro`, then link it from consumer projects:
```qmake
-include($$PWD/Libs/SoftNumKeyBoard/NumKeyBoard.pri)
+unix|win32: LIBS += -L$$PWD/Build/Libs/ -lNumKeyBoard
+INCLUDEPATH += $$PWD/Libs/NumKeyBoard
+DEPENDPATH += $$PWD/Libs/NumKeyBoard
```
-- 主工程中重写eventFilter函数,实现点击lineedit时,调出小键盘
+## API
-```cpp
-protected:
- virtual bool eventFilter(QObject * obj, QEvent *event) override;
-```
+Use the shared singleton-style keyboard API:
```cpp
-bool SettingWidget::eventFilter(QObject *obj, QEvent * event)
+auto *keyboard = KeyBoard::app();
+if(!keyboard)
{
- auto _obj = static_cast(obj);
- if(m_inputList.contains(_obj))
- {
- if(event->type() == QEvent::FocusIn)
- {
- if(!_keyBoard)
- {
- _keyBoard = new NumKeyDia(this);
- }
- //传入对应的QLineEdit
- _keyBoard->setPLineEdit(_obj);
- _keyBoard->exec();
- //QLineEdit取消聚焦,可以不用
- _obj->clearFocus();
- return true;
- }
- }
- return QObject::eventFilter(obj, event);
+ keyboard = new NumKeyDia;
}
-```
-
-- 对应的控件安装事件过滤器
-```cpp
- m_inputList = this->findChildren();
- foreach (auto &i, m_inputList)
- {
- i->installEventFilter(this);
- i->setFocusPolicy(Qt::ClickFocus);
- }
-```
-
-- 控件设置属性
-
-```cpp
- //设置输入输出的最大值、最小值、名字和是否是数字
- ui->lineEdit_energyA->setProperty("IsNum", true);
- //double时,默认保留三位小数
- ui->lineEdit_energyA->setProperty("IsDouble", true);
- //输入的数不能超过最大值和最小值
- ui->lineEdit_energyA->setProperty("Max", 1.000);
- ui->lineEdit_energyA->setProperty("Min", 0.000);
- ui->lineEdit_energyA->setProperty("Name", tr("PressureA"));
+keyboard->setValue(lineEdit->text());
+keyboard->exec();
+lineEdit->setText(keyboard->getValue());
```
+The old `setPLineEdit` / range-validation API is no longer part of the shared library.
diff --git a/numkeydia.cpp b/numkeydia.cpp
index 057c407..e43a611 100644
--- a/numkeydia.cpp
+++ b/numkeydia.cpp
@@ -1,192 +1,135 @@
-#include "numkeydia.h"
+#include "numkeydia.h"
#include "ui_numkeydia.h"
-#include
+
#include
-#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace
+{
+void loadKeyboardStyleSheet(QWidget *widget)
+{
+ if(!widget)
+ {
+ return;
+ }
+
+ QFile file(QStringLiteral(":/commonWidget.qss"));
+ if(!file.open(QFile::ReadOnly | QFile::Text))
+ {
+ qDebug() << QStringLiteral("Unable to load keyboard stylesheet");
+ return;
+ }
+
+ QTextStream stream(&file);
+ widget->setStyleSheet(stream.readAll());
+}
+}
+
+NumKeyDia *NumKeyDia::singleton = nullptr;
NumKeyDia::NumKeyDia(QWidget *parent) :
QDialog(parent),
ui(new Ui::NumKeyDia)
{
+ loadKeyboardStyleSheet(this);
+ if(singleton != nullptr)
+ {
+ return;
+ }
+ singleton = this;
ui->setupUi(this);
- this->setWindowFlag(Qt::FramelessWindowHint);
- ui->lineEdit_input->setCursorPosition(Qt::StrongFocus);
+ this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
+ ui->lineEdit_input->setFocusPolicy(Qt::StrongFocus);
auto _btnInputList = ui->widget_input->findChildren();
foreach (auto &i, _btnInputList)
{
connect(i, &QPushButton::clicked, this, &NumKeyDia::btn_input_clicked);
i->setFocusPolicy(Qt::NoFocus);
}
+
+ auto *returnShortcut = new QShortcut(QKeySequence(Qt::Key_Return), this);
+ connect(returnShortcut, &QShortcut::activated, this, &NumKeyDia::on_btn_ok_clicked);
+
+ auto *enterShortcut = new QShortcut(QKeySequence(Qt::Key_Enter), this);
+ connect(enterShortcut, &QShortcut::activated, this, &NumKeyDia::on_btn_ok_clicked);
+
ui->toolButton_ico->installEventFilter(this);
ui->label_appInfo->installEventFilter(this);
+ ui->btn_clear->setText(QStringLiteral("<"));
+ setInputPage(InputPage::NumberPage);
}
NumKeyDia::~NumKeyDia()
{
+ if(singleton == this)
+ {
+ singleton = nullptr;
+ }
delete ui;
}
bool NumKeyDia::eventFilter(QObject *, QEvent *event)
{
- if(event->type() == QEvent::MouseButtonDblClick)
+ if(event->type() == QEvent::MouseButtonPress)
{
- if(!m_bMaxFlag)
- {
- this->showFullScreen();
- m_bMaxFlag = true;
- }
- else
- {
- this->showNormal();
- m_bMaxFlag = false;
- }
- return true;
- }
- else if(event->type() == QEvent::MouseButtonPress)
- {
- QMouseEvent *mouseEvent = static_cast(event);
+ auto *mouseEvent = static_cast(event);
m_point = mouseEvent->globalPos() - frameGeometry().topLeft();
- //鼠标位置减去左上角的左边
}
else if(event->type() == QEvent::MouseMove)
{
- QMouseEvent *mouseEvent = static_cast(event);
+ auto *mouseEvent = static_cast(event);
move(mouseEvent->globalPos() - m_point);
}
return false;
}
-QLineEdit *NumKeyDia::pLineEdit() const
+void NumKeyDia::setValue(const QString &value)
{
- return m_pLineEdit;
-}
-
-void NumKeyDia::setPLineEdit(QLineEdit *newPLineEdit)
-{
- m_pLineEdit = newPLineEdit;
- QString _text = m_pLineEdit->text();
-// int _cnt = _text.count();
-// for(int i = 0; i < _cnt; ++i)
-// {
-// if(_text.at(0) != "1" && _text.at(0) != "2" && _text.at(0) != "3" && _text.at(0) != "4" &&
-// _text.at(0) != "5" && _text.at(0) != "6" && _text.at(0) != "7" && _text.at(0) != "8" && _text.at(0) != "9")
-// {
-// _text.remove(0, 1);
-// }
-// }
+ this->value = value;
+ setInputPage(InputPage::NumberPage);
ui->lineEdit_input->setFocus();
- ui->lineEdit_input->setText(_text);
- newPLineEdit->setEnabled(false);
+ ui->lineEdit_input->setText(value);
+ ui->lineEdit_input->setCursorPosition(ui->lineEdit_input->text().size());
m_firstInputFlag = true;
+}
- ui->label_3->setText(m_pLineEdit->property("Name").toString() + ": ");
-
- //最大值和最小值显示
- m_isNum = m_pLineEdit->property("IsNum").toBool();
- if(!m_isNum)
- {
- ui->label_min->setText(tr("no limit"));
- ui->label_max->setText(tr("no limit"));
- return;
- }
-
- m_minValue = m_pLineEdit->property("Min").toDouble();
- m_maxValue = m_pLineEdit->property("Max").toDouble();
-
- m_isDouble = m_pLineEdit->property("IsDouble").toBool();
-
- if(m_isDouble)
- {
- m_format = m_pLineEdit->property("Format").toInt();
- m_prec = m_pLineEdit->property("Prec").toInt();
- }
-
- if(m_minValue == m_maxValue)
- {
- ui->label_min->setText(tr("no limit"));
- ui->label_max->setText(tr("no limit"));
- }
- else
- {
- if(m_isDouble)
- {
- ui->label_max->setText(QString::number(m_maxValue, m_format, m_prec));
- ui->label_min->setText(QString::number(m_minValue, m_format, m_prec));
- }
- else
- {
- ui->label_max->setText(QString::number(m_maxValue, 10, 0));
- ui->label_min->setText(QString::number(m_minValue, 10, 0));
- }
- }
+QString &NumKeyDia::getValue()
+{
+ return value;
}
void NumKeyDia::on_btn_ok_clicked()
{
- if(!m_pLineEdit)
- return;
-
- //如果输入为空,那么设为0
QString _res = ui->lineEdit_input->text();
- if(_res == "")
- _res = "0";
-
- //不是数字,直接设置后返回
- if(!m_isNum)
+ if(_res.isEmpty())
{
- m_pLineEdit->setText(_res);
+ _res = QStringLiteral("0");
}
- else
- {
- bool ok;
- double _d = ui->lineEdit_input->text().toDouble(&ok);
- if(!ok)
- {
- QMessageBox::critical(this, "error", "Input is not a number!\nPlease reInput");
- return;
- }
-
- bool _isNotValid = false;
- if(m_minValue < m_maxValue)
- {
-// _d = (_d < m_minValue) ? m_minValue : _d;
-// _d = (_d > m_maxValue) ? m_maxValue : _d;
- if(_d < m_minValue || _d > m_maxValue)
- _isNotValid = true;
- }
- if(_isNotValid)
- {
- QMessageBox::critical(this, "error", "Input is not valid!\nPlease reInput");
- return;
- }
-
- if(m_isDouble)
- m_pLineEdit->setText(QString::number(_d, m_format, m_prec));
- else
- m_pLineEdit->setText(QString::number(_d, 10, 0));
- }
+ value = _res;
closeKeyBoard();
}
-
void NumKeyDia::on_btn_cancel_clicked()
{
- //取消,关闭数字键盘
closeKeyBoard();
}
-
void NumKeyDia::on_btn_clear_clicked()
{
- //清空
- ui->lineEdit_input->clear();
+ m_firstInputFlag = false;
+ const int currentPosition = ui->lineEdit_input->cursorPosition();
+ ui->lineEdit_input->setCursorPosition(qMax(0, currentPosition - 1));
ui->lineEdit_input->setFocus();
}
-
void NumKeyDia::on_btn_back_clicked()
{
m_firstInputFlag = false;
@@ -194,51 +137,127 @@ void NumKeyDia::on_btn_back_clicked()
int _index = ui->lineEdit_input->cursorPosition();
QString _currentText = ui->lineEdit_input->text();
- if(_currentText == "")
+ if(_currentText.isEmpty())
+ {
ui->lineEdit_input->setFocus();
+ }
- //当前光标在最前面,不做任何处理
if(_index != 0)
{
- //删除前一个字符
_currentText.remove(_index - 1, 1);
ui->lineEdit_input->setText(_currentText);
}
ui->lineEdit_input->setFocus();
- ui->lineEdit_input->setCursorPosition(_index - 1);
+ ui->lineEdit_input->setCursorPosition(qMax(0, _index - 1));
}
void NumKeyDia::btn_input_clicked()
{
+ auto *_btnClicked = qobject_cast(sender());
+ if(!_btnClicked)
+ {
+ return;
+ }
+
+ if(_btnClicked->property("isModeSwitch").toBool())
+ {
+ const auto nextPage = (m_inputPage == InputPage::NumberPage)
+ ? InputPage::SymbolPage
+ : InputPage::NumberPage;
+ setInputPage(nextPage);
+ ui->lineEdit_input->setFocus();
+ return;
+ }
+
if(m_firstInputFlag)
{
ui->lineEdit_input->clear();
m_firstInputFlag = false;
}
- auto _btnClicked = qobject_cast(sender());
- QString _inputValue = _btnClicked->text();
+
+ const QString _inputValue = _btnClicked->property("inputValue").toString();
+ if(_inputValue.isEmpty())
+ {
+ ui->lineEdit_input->setFocus();
+ return;
+ }
int _index = ui->lineEdit_input->cursorPosition();
QString _currentText = ui->lineEdit_input->text();
_currentText.insert(_index, _inputValue);
ui->lineEdit_input->setText(_currentText);
+ ui->lineEdit_input->setFocus();
+ ui->lineEdit_input->setCursorPosition(_index + _inputValue.size());
}
void NumKeyDia::closeKeyBoard()
{
this->close();
- m_pLineEdit->setEnabled(true);
}
-void NumKeyDia::setMaxValue(double newMaxValue)
+void NumKeyDia::setInputPage(InputPage page)
{
- m_maxValue = newMaxValue;
+ m_inputPage = page;
+ refreshInputButtons();
}
-void NumKeyDia::setMinValue(double newMinValue)
+void NumKeyDia::refreshInputButtons()
{
- m_minValue = newMinValue;
+ if(m_inputPage == InputPage::NumberPage)
+ {
+ configureInputButton(ui->btn_1, QStringLiteral("1"), QStringLiteral("1"), true);
+ configureInputButton(ui->btn_2, QStringLiteral("2"), QStringLiteral("2"), true);
+ configureInputButton(ui->btn_3, QStringLiteral("3"), QStringLiteral("3"), true);
+ configureInputButton(ui->btn_4, QStringLiteral("4"), QStringLiteral("4"), true);
+ configureInputButton(ui->btn_5, QStringLiteral("5"), QStringLiteral("5"), true);
+ configureInputButton(ui->btn_6, QStringLiteral("6"), QStringLiteral("6"), true);
+ configureInputButton(ui->btn_7, QStringLiteral("7"), QStringLiteral("7"), true);
+ configureInputButton(ui->btn_8, QStringLiteral("8"), QStringLiteral("8"), true);
+ configureInputButton(ui->btn_9, QStringLiteral("9"), QStringLiteral("9"), true);
+ configureInputButton(ui->btn_sub, QStringLiteral("#+="), QString(), true, true);
+ configureInputButton(ui->btn_0, QStringLiteral("0"), QStringLiteral("0"), true);
+ configureInputButton(ui->pushButton_dot, QStringLiteral("."), QStringLiteral("."), true);
+ return;
+ }
+
+ configureInputButton(ui->btn_1, QStringLiteral("/"), QStringLiteral("/"), true);
+ configureInputButton(ui->btn_2, QStringLiteral("-"), QStringLiteral("-"), true);
+ configureInputButton(ui->btn_3, QStringLiteral(":"), QStringLiteral(":"), true);
+ const QString degreeSymbol(QChar(0x00B0));
+ configureInputButton(ui->btn_4, degreeSymbol, degreeSymbol, true);
+ configureInputButton(ui->btn_5, QStringLiteral("'"), QStringLiteral("'"), true);
+ configureInputButton(ui->btn_6, QStringLiteral("\""), QStringLiteral("\""), true);
+ configureInputButton(ui->btn_7, QStringLiteral("."), QStringLiteral("."), true);
+ configureInputButton(ui->btn_8, QStringLiteral("_"), QStringLiteral("_"), true);
+ configureInputButton(ui->btn_9, QStringLiteral("@"), QStringLiteral("@"), true);
+ configureInputButton(ui->btn_sub, QStringLiteral("123"), QString(), true, true);
+ configureInputButton(ui->btn_0, QStringLiteral("+"), QStringLiteral("+"), true);
+ configureInputButton(ui->pushButton_dot, QStringLiteral(","), QStringLiteral(","), true);
+}
+
+void NumKeyDia::configureInputButton(QPushButton *button,
+ const QString &label,
+ const QString &value,
+ bool enabled,
+ bool isModeSwitch)
+{
+ if(!button)
+ {
+ return;
+ }
+
+ button->setText(label);
+ button->setEnabled(enabled);
+ button->setProperty("inputValue", value);
+ button->setProperty("isModeSwitch", isModeSwitch);
}
+namespace KeyBoard
+{
+NumKeyDia *app()
+{
+ return NumKeyDia::instance();
+};
+};
diff --git a/numkeydia.h b/numkeydia.h
index b58be3c..5c28760 100644
--- a/numkeydia.h
+++ b/numkeydia.h
@@ -1,16 +1,18 @@
-#ifndef NUMKEYDIA_H
+#ifndef NUMKEYDIA_H
#define NUMKEYDIA_H
-#include
+#include "NumKeyBoard_global.h"
#include
#include
+class QPushButton;
+
namespace Ui
{
class NumKeyDia;
}
-class Q_DECL_EXPORT NumKeyDia : public QDialog
+class NUMKEYBOARD_EXPORT NumKeyDia : public QDialog
{
Q_OBJECT
@@ -18,15 +20,16 @@ public:
explicit NumKeyDia(QWidget *parent = nullptr);
~NumKeyDia();
- QLineEdit *pLineEdit() const;
- void setPLineEdit(QLineEdit *newPLineEdit);
-
- void setMinValue(double newMinValue);
+ static NumKeyDia *instance()
+ {
+ return singleton;
+ }
- void setMaxValue(double newMaxValue);
+ void setValue(const QString &value);
+ QString &getValue();
protected:
- virtual bool eventFilter(QObject * obj, QEvent *event) override;
+ virtual bool eventFilter(QObject *obj, QEvent *event) override;
private slots:
void on_btn_ok_clicked();
@@ -42,22 +45,35 @@ private slots:
void closeKeyBoard();
private:
+ enum class InputPage
+ {
+ NumberPage,
+ SymbolPage
+ };
+
+ void setInputPage(InputPage page);
+ void refreshInputButtons();
+ void configureInputButton(QPushButton *button,
+ const QString &label,
+ const QString &value,
+ bool enabled,
+ bool isModeSwitch = false);
+
Ui::NumKeyDia *ui;
- QLineEdit *m_pLineEdit = nullptr;
+ static NumKeyDia *singleton;
- bool m_bMaxFlag = false;
+ QString value = QString();
QPoint m_point;
bool m_firstInputFlag = true;
+ InputPage m_inputPage = InputPage::NumberPage;
+};
- double m_minValue = 0.000;
- double m_maxValue = 0.000;
- bool m_isNum = false;
- bool m_isDouble = false;
- char m_format = 'f';
- int m_prec = 3;
+namespace KeyBoard
+{
+NUMKEYBOARD_EXPORT NumKeyDia *app();
};
#endif // NUMKEYDIA_H
diff --git a/numkeydia.ui b/numkeydia.ui
index b78d724..1feeba8 100644
--- a/numkeydia.ui
+++ b/numkeydia.ui
@@ -6,8 +6,8 @@
0
0
- 536
- 430
+ 530
+ 375
@@ -26,40 +26,39 @@
0
- -
-
+
+ 0
+
+
-
+
Qt::Vertical
- QSizePolicy::MinimumExpanding
+ QSizePolicy::Fixed
10
- 0
+ 10
- -
-
-
- Qt::Horizontal
+
-
+
+
+ 5
-
- QSizePolicy::MinimumExpanding
+
+ 5
-
-
- 10
- 20
-
+
+ 5
+
+
+ 5
-
-
- -
-
-
@@ -83,7 +82,7 @@
- border-image: url(:/resources/140xfd.ico);
+ border-image: url(:/Images/keyboard.svg);
@@ -115,7 +114,7 @@
- Numeric Keypad
+ 数字键盘
@@ -132,7 +131,7 @@
- CurrentInput:
+ 输入:
@@ -155,81 +154,17 @@
-
-
-
-
-
-
-
- 12
- false
-
-
-
- Minimum:
-
-
-
- -
-
-
-
- Times New Roman
- 12
- false
-
-
-
- 0.000
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
-
- 12
- false
-
-
-
- Maximum:
-
-
-
- -
-
-
-
- 0
- 40
-
-
-
-
- Times New Roman
- 12
- false
-
-
-
- 1.000
-
-
-
-
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
-
@@ -709,6 +644,22 @@
+ -
+
+
+ Qt::Horizontal
+
+
+ QSizePolicy::MinimumExpanding
+
+
+
+ 10
+ 20
+
+
+
+
-
@@ -725,18 +676,18 @@
- -
-
+
-
+
Qt::Vertical
- QSizePolicy::MinimumExpanding
+ QSizePolicy::Fixed
10
- 10
+ 0