#pragma once #include "InputCore.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "Core/Base/global_include.h" namespace YSG { class VirtualKeyBoard; class KeyButton : public QPushButton { Q_OBJECT public: explicit KeyButton(); Qt::Key mKey; QString mText; Qt::KeyboardModifiers modifiers = Qt::NoModifier; bool isText = false; VirtualKeyBoard *mVirtualKeyBoard{}; }; class VirtualKeyBoard : public QWidget, public Psc::Singleton { Q_OBJECT public: explicit VirtualKeyBoard(QWidget *parent = nullptr); ~VirtualKeyBoard() override; bool eventFilter(QObject *watched, QEvent *event) override; void setEdit(QWidget *edit); void getCandidateList(QString spell); bool issingleChar(QString spell); void handleKeyPress(KeyButton *button); bool mMoving = false; QPoint mStartPos, mStartGlobalPos; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; public: enum State { English, Chinese, } mState = English; QWidget *mInputWidget{}; InputCore *mCore; KeyButton * createTextKey(const QString &showText, const QString &text, Qt::Key key, Qt::KeyboardModifiers modifiers, QHBoxLayout *layout) { auto t = createTextKeyButton(text, key, layout, true); t->setText(showText); t->modifiers = modifiers; return t; } QSizePolicy sizePolicy; KeyButton *createTextKeyButton(const QString &text, Qt::Key key, QHBoxLayout *layout, bool isText = true) { auto ret = new KeyButton; ret->setObjectName(text); ret->mKey = key; ret->mText = text; ret->isText = isText; layout->addWidget(ret); ret->setSizePolicy(sizePolicy); ret->mVirtualKeyBoard = this; return ret; } QWidget *mEnglish, *mChinese, *mSymbol, *mCurWidget{}; QVBoxLayout *mMainLayout; QLineEdit *mEdit{}; QListWidget *listWidget{}; QWidget *createChinese() { auto ret = new QWidget; auto mainLayout = new QVBoxLayout(ret); QFont font; font.setFamily("黑体"); // 设置字体为黑体 font.setPointSize(16); // 设置字体大小为 16pt QSizePolicy sizePolicy2(QSizePolicy::Preferred, QSizePolicy::Preferred); mEdit = new QLineEdit; mEdit->setSizePolicy(sizePolicy2); listWidget = new QListWidget; listWidget->setSizePolicy(sizePolicy2); mEdit->setFont(font); listWidget->setFont(font); int lineHeight = QFontMetrics(font).lineSpacing() + 8; mEdit->setFixedHeight(lineHeight); listWidget->setFixedHeight(lineHeight); auto line0 = new QHBoxLayout; line0->addWidget(mEdit, 3); line0->addWidget(listWidget, 5); mainLayout->addLayout(line0); auto line1 = new QHBoxLayout(); mainLayout->addLayout(line1, 5); createTextKey("q", "q", Qt::Key_Q, Qt::NoModifier, line1); createTextKey("w", "w", Qt::Key_W, Qt::NoModifier, line1); createTextKey("e", "e", Qt::Key_E, Qt::NoModifier, line1); createTextKey("r", "r", Qt::Key_R, Qt::NoModifier, line1); createTextKey("t", "t", Qt::Key_T, Qt::NoModifier, line1); createTextKey("y", "y", Qt::Key_Y, Qt::NoModifier, line1); createTextKey("u", "u", Qt::Key_U, Qt::NoModifier, line1); createTextKey("i", "i", Qt::Key_I, Qt::NoModifier, line1); createTextKey("o", "o", Qt::Key_O, Qt::NoModifier, line1); createTextKey("p", "p", Qt::Key_P, Qt::NoModifier, line1); auto line2 = new QHBoxLayout(); mainLayout->addLayout(line2, 5); createTextKey("a", "a", Qt::Key_A, Qt::NoModifier, line2); createTextKey("s", "s", Qt::Key_S, Qt::NoModifier, line2); createTextKey("d", "d", Qt::Key_D, Qt::NoModifier, line2); createTextKey("f", "f", Qt::Key_F, Qt::NoModifier, line2); createTextKey("g", "g", Qt::Key_G, Qt::NoModifier, line2); createTextKey("h", "h", Qt::Key_H, Qt::NoModifier, line2); createTextKey("j", "j", Qt::Key_J, Qt::NoModifier, line2); createTextKey("k", "k", Qt::Key_K, Qt::NoModifier, line2); createTextKey("l", "l", Qt::Key_L, Qt::NoModifier, line2); auto line3 = new QHBoxLayout(); mainLayout->addLayout(line3, 5); createTextKey("z", "z", Qt::Key_Z, Qt::NoModifier, line3); createTextKey("x", "x", Qt::Key_X, Qt::NoModifier, line3); createTextKey("c", "c", Qt::Key_C, Qt::NoModifier, line3); createTextKey("v", "v", Qt::Key_V, Qt::NoModifier, line3); createTextKey("b", "b", Qt::Key_B, Qt::NoModifier, line3); createTextKey("n", "n", Qt::Key_N, Qt::NoModifier, line3); createTextKey("m", "m", Qt::Key_M, Qt::NoModifier, line3); createTextKey("Backspace", "\b", Qt::Key_Backspace, Qt::NoModifier, line3); auto line4 = new QHBoxLayout(); mainLayout->addLayout(line4, 5); auto changeTo123 = new QPushButton; line4->addWidget(changeTo123, 1); changeTo123->setSizePolicy(sizePolicy); changeTo123->setText("?123"); connect(changeTo123, &KeyButton::clicked, [this, changeTo123]() { mCurWidget->hide(); mSymbol->show(); }); auto changeToEnglish = new QPushButton; changeToEnglish->setText("En"); changeToEnglish->setSizePolicy(sizePolicy); line4->addWidget(changeToEnglish, 1); connect(changeToEnglish, &KeyButton::clicked, [&, changeToEnglish]() { mCurWidget->hide(); mEnglish->show(); mCurWidget = mEnglish; mState = English; }); auto space = createTextKey(" ", " ", Qt::Key_Space, Qt::NoModifier, line4); QSizePolicy sizePolicy1(QSizePolicy::Preferred, QSizePolicy::Preferred); sizePolicy1.setHorizontalStretch(5); space->setSizePolicy(sizePolicy1); auto hide = new QPushButton; hide->setText("隐藏"); hide->setSizePolicy(sizePolicy); line4->addWidget(hide, 1); connect(hide, &KeyButton::clicked, this, &QWidget::hide); return ret; } QWidget *createEnglish() { auto ret = new QWidget; auto mainLayout = new QVBoxLayout(ret); auto line1 = new QHBoxLayout(); mainLayout->addLayout(line1); createTextKey("q", "q", Qt::Key_Q, Qt::NoModifier, line1); createTextKey("w", "w", Qt::Key_W, Qt::NoModifier, line1); createTextKey("e", "e", Qt::Key_E, Qt::NoModifier, line1); createTextKey("r", "r", Qt::Key_R, Qt::NoModifier, line1); createTextKey("t", "t", Qt::Key_T, Qt::NoModifier, line1); createTextKey("y", "y", Qt::Key_Y, Qt::NoModifier, line1); createTextKey("u", "u", Qt::Key_U, Qt::NoModifier, line1); createTextKey("i", "i", Qt::Key_I, Qt::NoModifier, line1); createTextKey("o", "o", Qt::Key_O, Qt::NoModifier, line1); createTextKey("p", "p", Qt::Key_P, Qt::NoModifier, line1); auto line2 = new QHBoxLayout(); mainLayout->addLayout(line2); createTextKey("a", "a", Qt::Key_A, Qt::NoModifier, line2); createTextKey("s", "s", Qt::Key_S, Qt::NoModifier, line2); createTextKey("d", "d", Qt::Key_D, Qt::NoModifier, line2); createTextKey("f", "f", Qt::Key_F, Qt::NoModifier, line2); createTextKey("g", "g", Qt::Key_G, Qt::NoModifier, line2); createTextKey("h", "h", Qt::Key_H, Qt::NoModifier, line2); createTextKey("j", "j", Qt::Key_J, Qt::NoModifier, line2); createTextKey("k", "k", Qt::Key_K, Qt::NoModifier, line2); createTextKey("l", "l", Qt::Key_L, Qt::NoModifier, line2); auto line3 = new QHBoxLayout(); mainLayout->addLayout(line3); auto capsLock = new QPushButton; line3->addWidget(capsLock, 1); capsLock->setSizePolicy(sizePolicy); capsLock->setText("大写"); connect(capsLock, &QPushButton::clicked, [this, capsLock]() { if (capsLock->text() == "大写") { for (auto child: mEnglish->findChildren()) { if ((child->mText.size() == 1) && child->text().isLower()) { QString &&text = child->text().toUpper(); child->setText(text); child->mText = text; } } capsLock->setText("小写"); } else { for (auto child: mEnglish->findChildren()) { if ((child->mText.size() == 1) && child->text().isUpper()) { QString &&text = child->text().toLower(); child->setText(text); child->mText = text; } } capsLock->setText("大写"); } }); createTextKey("z", "z", Qt::Key_Z, Qt::NoModifier, line3); createTextKey("x", "x", Qt::Key_X, Qt::NoModifier, line3); createTextKey("c", "c", Qt::Key_C, Qt::NoModifier, line3); createTextKey("v", "v", Qt::Key_V, Qt::NoModifier, line3); createTextKey("b", "b", Qt::Key_B, Qt::NoModifier, line3); createTextKey("n", "n", Qt::Key_N, Qt::NoModifier, line3); createTextKey("m", "m", Qt::Key_M, Qt::NoModifier, line3); createTextKey("Backspace", "\b", Qt::Key_Backspace, Qt::NoModifier, line3); auto line4 = new QHBoxLayout(); mainLayout->addLayout(line4); auto changeTo123 = new QPushButton; line4->addWidget(changeTo123, 1); changeTo123->setSizePolicy(sizePolicy); changeTo123->setText("?123"); connect(changeTo123, &KeyButton::clicked, [this, changeTo123]() { mCurWidget->hide(); mSymbol->show(); }); auto changeToCh = new QPushButton; changeToCh->setText("中文"); changeToCh->setSizePolicy(sizePolicy); line4->addWidget(changeToCh, 1); connect(changeToCh, &KeyButton::clicked, [&]() { mCurWidget->hide(); mChinese->show(); mCurWidget = mChinese; mState = Chinese; }); auto space = createTextKey(" ", " ", Qt::Key_Space, Qt::NoModifier, line4); QSizePolicy sizePolicy1(QSizePolicy::Preferred, QSizePolicy::Preferred); sizePolicy1.setHorizontalStretch(5); space->setSizePolicy(sizePolicy1); auto hide = new QPushButton; hide->setText("隐藏"); hide->setSizePolicy(sizePolicy); line4->addWidget(hide, 1); connect(hide, &KeyButton::clicked, this, &QWidget::hide); return ret; } QWidget *createSymbol() { auto ret = new QWidget; auto mainLayout = new QVBoxLayout(ret); auto line1 = new QHBoxLayout(); mainLayout->addLayout(line1); createTextKey("1", "1", Qt::Key_1, Qt::NoModifier, line1); createTextKey("2", "2", Qt::Key_2, Qt::NoModifier, line1); createTextKey("3", "3", Qt::Key_3, Qt::NoModifier, line1); createTextKey("4", "4", Qt::Key_4, Qt::NoModifier, line1); createTextKey("5", "5", Qt::Key_5, Qt::NoModifier, line1); createTextKey("6", "6", Qt::Key_6, Qt::NoModifier, line1); createTextKey("7", "7", Qt::Key_7, Qt::NoModifier, line1); createTextKey("8", "8", Qt::Key_8, Qt::NoModifier, line1); createTextKey("9", "9", Qt::Key_9, Qt::NoModifier, line1); createTextKey("0", "0", Qt::Key_0, Qt::NoModifier, line1); auto line2 = new QHBoxLayout(); mainLayout->addLayout(line2); createTextKey("!", "!", Qt::Key_1, Qt::ShiftModifier, line2); createTextKey("@", "@", Qt::Key_2, Qt::ShiftModifier, line2); createTextKey("#", "#", Qt::Key_3, Qt::ShiftModifier, line2); createTextKey("%", "%", Qt::Key_5, Qt::ShiftModifier, line2); createTextKey("&&", "&", Qt::Key_7, Qt::ShiftModifier, line2); createTextKey("*", "*", Qt::Key_8, Qt::ShiftModifier, line2); createTextKey("(", "(", Qt::Key_9, Qt::ShiftModifier, line2); createTextKey(")", ")", Qt::Key_0, Qt::ShiftModifier, line2); createTextKey("-", "-", Qt::Key_Minus, Qt::NoModifier, line2); auto line3 = new QHBoxLayout(); mainLayout->addLayout(line3); createTextKey("_", "_", Qt::Key_Underscore, Qt::ShiftModifier, line3); createTextKey(":", ":", Qt::Key_Colon, Qt::ShiftModifier, line3); createTextKey(";", ";", Qt::Key_Semicolon, Qt::NoModifier, line3); createTextKey("/", "/", Qt::Key_Slash, Qt::NoModifier, line3); createTextKey(".", ".", Qt::Key_Period, Qt::NoModifier, line3); createTextKey(",", ",", Qt::Key_Comma, Qt::NoModifier, line3); createTextKey("?", "?", Qt::Key_Question, Qt::ShiftModifier, line3); createTextKey("Backspace", "\b", Qt::Key_Backspace, Qt::NoModifier, line3); auto line4 = new QHBoxLayout(); mainLayout->addLayout(line4); auto back = new QPushButton; back->setText("返回"); back->setSizePolicy(sizePolicy); line4->addWidget(back, 1); connect(back, &KeyButton::clicked, [&]() { mSymbol->hide(); mCurWidget->show(); }); auto space = createTextKey(" ", " ", Qt::Key_Space, Qt::NoModifier, line4); QSizePolicy sizePolicy1(QSizePolicy::Preferred, QSizePolicy::Preferred); sizePolicy1.setHorizontalStretch(5); space->setSizePolicy(sizePolicy1); auto hide = new QPushButton; hide->setText("隐藏"); hide->setSizePolicy(sizePolicy); line4->addWidget(hide, 1); connect(hide, &KeyButton::clicked, this, &QWidget::hide); return ret; } }; }