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