首次提交
This commit is contained in:
@@ -0,0 +1,314 @@
|
||||
#pragma once
|
||||
|
||||
#include "InputCore.h"
|
||||
#include <QDebug>
|
||||
#include <QHBoxLayout>
|
||||
#include <QKeyEvent>
|
||||
#include <QListWidgetItem>
|
||||
#include <QPushButton>
|
||||
#include <QScroller>
|
||||
#include <QShowEvent>
|
||||
#include <QVBoxLayout>
|
||||
#include <QWidget>
|
||||
|
||||
#include <QLineEdit>
|
||||
#include <QListWidget>
|
||||
#include <utility>
|
||||
|
||||
#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<VirtualKeyBoard> {
|
||||
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<KeyButton *>()) {
|
||||
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<KeyButton *>()) {
|
||||
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;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user