308 lines
14 KiB
C++
308 lines
14 KiB
C++
#pragma once
|
|
#include <QDebug>
|
|
#include <QHBoxLayout>
|
|
#include <QKeyEvent>
|
|
#include <QLineEdit>
|
|
#include <QListWidget>
|
|
#include <QListWidgetItem>
|
|
#include <QPushButton>
|
|
#include <QScroller>
|
|
#include <QShowEvent>
|
|
#include <QVBoxLayout>
|
|
#include <QWidget>
|
|
#include <utility>
|
|
#include "Core/Base/global_include.h"
|
|
#include "Input_Core.h"
|
|
namespace renderive {
|
|
class Virtual_Keyboard;
|
|
class Key_Button : public QPushButton {
|
|
public:
|
|
explicit Key_Button();
|
|
Qt::Key key;
|
|
QString text;
|
|
Qt::KeyboardModifiers modifiers = Qt::NoModifier;
|
|
bool is_text = false;
|
|
Virtual_Keyboard* virtual_keyboard{};
|
|
};
|
|
class Virtual_Keyboard : public QWidget, public Psc::Singleton<Virtual_Keyboard> {
|
|
public:
|
|
explicit Virtual_Keyboard(QWidget* parent = nullptr);
|
|
~Virtual_Keyboard() override;
|
|
bool eventFilter(QObject* watched, QEvent* event) override;
|
|
void set_edit(QWidget* edit);
|
|
void get_candidate_list(QString spell);
|
|
bool is_single_char(QString spell);
|
|
void handle_Key_Press(Key_Button* button);
|
|
bool moving = false;
|
|
QPoint start_pos, start_global_pos;
|
|
void mousePressEvent(QMouseEvent* event) override;
|
|
void mouseMoveEvent(QMouseEvent* event) override;
|
|
void mouseReleaseEvent(QMouseEvent* event) override;
|
|
public:
|
|
enum State {
|
|
English,
|
|
Chinese,
|
|
} state = English;
|
|
QWidget* input_widget{};
|
|
Input_Core* core;
|
|
Key_Button*
|
|
create_text_key(const QString& show_text, const QString& text, Qt::Key key, Qt::KeyboardModifiers modifiers,
|
|
QHBoxLayout* layout) {
|
|
auto t = create_text_key_button(text, key, layout, true);
|
|
t->setText(show_text);
|
|
t->modifiers = modifiers;
|
|
return t;
|
|
}
|
|
QSizePolicy size_policy;
|
|
Key_Button* create_text_key_button(const QString& text, Qt::Key key, QHBoxLayout* layout, bool is_text = true) {
|
|
auto ret = new Key_Button;
|
|
ret->setObjectName(text);
|
|
ret->key = key;
|
|
ret->text = text;
|
|
ret->is_text = is_text;
|
|
layout->addWidget(ret);
|
|
ret->setSizePolicy(size_policy);
|
|
ret->virtual_keyboard = this;
|
|
return ret;
|
|
}
|
|
QWidget *english, *chinese, *symbol, *cur_widget{};
|
|
QVBoxLayout* main_layout;
|
|
QLineEdit* edit{};
|
|
QListWidget* list_widget{};
|
|
QWidget* create_chinese() {
|
|
auto ret = new QWidget;
|
|
auto main_layout = new QVBoxLayout(ret);
|
|
QFont font;
|
|
font.setFamily("黑体"); // 设置字体为黑体
|
|
font.setPointSize(16); // 设置字体大小为 16pt
|
|
QSizePolicy size_policy2(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
|
edit = new QLineEdit;
|
|
edit->setSizePolicy(size_policy2);
|
|
list_widget = new QListWidget;
|
|
list_widget->setSizePolicy(size_policy2);
|
|
edit->setFont(font);
|
|
list_widget->setFont(font);
|
|
int line_height = QFontMetrics(font).lineSpacing() + 8;
|
|
edit->setFixedHeight(line_height);
|
|
list_widget->setFixedHeight(line_height);
|
|
auto line0 = new QHBoxLayout;
|
|
line0->addWidget(edit, 3);
|
|
line0->addWidget(list_widget, 5);
|
|
main_layout->addLayout(line0);
|
|
auto line1 = new QHBoxLayout();
|
|
main_layout->addLayout(line1, 5);
|
|
create_text_key("q", "q", Qt::Key_Q, Qt::NoModifier, line1);
|
|
create_text_key("w", "w", Qt::Key_W, Qt::NoModifier, line1);
|
|
create_text_key("e", "e", Qt::Key_E, Qt::NoModifier, line1);
|
|
create_text_key("r", "r", Qt::Key_R, Qt::NoModifier, line1);
|
|
create_text_key("t", "t", Qt::Key_T, Qt::NoModifier, line1);
|
|
create_text_key("y", "y", Qt::Key_Y, Qt::NoModifier, line1);
|
|
create_text_key("u", "u", Qt::Key_U, Qt::NoModifier, line1);
|
|
create_text_key("i", "i", Qt::Key_I, Qt::NoModifier, line1);
|
|
create_text_key("o", "o", Qt::Key_O, Qt::NoModifier, line1);
|
|
create_text_key("p", "p", Qt::Key_P, Qt::NoModifier, line1);
|
|
auto line2 = new QHBoxLayout();
|
|
main_layout->addLayout(line2, 5);
|
|
create_text_key("a", "a", Qt::Key_A, Qt::NoModifier, line2);
|
|
create_text_key("s", "s", Qt::Key_S, Qt::NoModifier, line2);
|
|
create_text_key("d", "d", Qt::Key_D, Qt::NoModifier, line2);
|
|
create_text_key("f", "f", Qt::Key_F, Qt::NoModifier, line2);
|
|
create_text_key("g", "g", Qt::Key_G, Qt::NoModifier, line2);
|
|
create_text_key("h", "h", Qt::Key_H, Qt::NoModifier, line2);
|
|
create_text_key("j", "j", Qt::Key_J, Qt::NoModifier, line2);
|
|
create_text_key("k", "k", Qt::Key_K, Qt::NoModifier, line2);
|
|
create_text_key("l", "l", Qt::Key_L, Qt::NoModifier, line2);
|
|
auto line3 = new QHBoxLayout();
|
|
main_layout->addLayout(line3, 5);
|
|
create_text_key("z", "z", Qt::Key_Z, Qt::NoModifier, line3);
|
|
create_text_key("x", "x", Qt::Key_X, Qt::NoModifier, line3);
|
|
create_text_key("c", "c", Qt::Key_C, Qt::NoModifier, line3);
|
|
create_text_key("v", "v", Qt::Key_V, Qt::NoModifier, line3);
|
|
create_text_key("b", "b", Qt::Key_B, Qt::NoModifier, line3);
|
|
create_text_key("n", "n", Qt::Key_N, Qt::NoModifier, line3);
|
|
create_text_key("m", "m", Qt::Key_M, Qt::NoModifier, line3);
|
|
create_text_key("Backspace", "\b", Qt::Key_Backspace, Qt::NoModifier, line3);
|
|
auto line4 = new QHBoxLayout();
|
|
main_layout->addLayout(line4, 5);
|
|
auto change_to_123 = new QPushButton;
|
|
line4->addWidget(change_to_123, 1);
|
|
change_to_123->setSizePolicy(size_policy);
|
|
change_to_123->setText("?123");
|
|
connect(change_to_123, &Key_Button::clicked, [this, change_to_123]() {
|
|
cur_widget->hide();
|
|
symbol->show();
|
|
});
|
|
auto change_to_english = new QPushButton;
|
|
change_to_english->setText("En");
|
|
change_to_english->setSizePolicy(size_policy);
|
|
line4->addWidget(change_to_english, 1);
|
|
connect(change_to_english, &Key_Button::clicked, [&, change_to_english]() {
|
|
cur_widget->hide();
|
|
english->show();
|
|
cur_widget = english;
|
|
state = English;
|
|
});
|
|
auto space = create_text_key(" ", " ", Qt::Key_Space, Qt::NoModifier, line4);
|
|
QSizePolicy size_policy1(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
|
size_policy1.setHorizontalStretch(5);
|
|
space->setSizePolicy(size_policy1);
|
|
auto hide = new QPushButton;
|
|
hide->setText("隐藏");
|
|
hide->setSizePolicy(size_policy);
|
|
line4->addWidget(hide, 1);
|
|
connect(hide, &Key_Button::clicked, this, &QWidget::hide);
|
|
return ret;
|
|
}
|
|
QWidget* create_english() {
|
|
auto ret = new QWidget;
|
|
auto main_layout = new QVBoxLayout(ret);
|
|
auto line1 = new QHBoxLayout();
|
|
main_layout->addLayout(line1);
|
|
create_text_key("q", "q", Qt::Key_Q, Qt::NoModifier, line1);
|
|
create_text_key("w", "w", Qt::Key_W, Qt::NoModifier, line1);
|
|
create_text_key("e", "e", Qt::Key_E, Qt::NoModifier, line1);
|
|
create_text_key("r", "r", Qt::Key_R, Qt::NoModifier, line1);
|
|
create_text_key("t", "t", Qt::Key_T, Qt::NoModifier, line1);
|
|
create_text_key("y", "y", Qt::Key_Y, Qt::NoModifier, line1);
|
|
create_text_key("u", "u", Qt::Key_U, Qt::NoModifier, line1);
|
|
create_text_key("i", "i", Qt::Key_I, Qt::NoModifier, line1);
|
|
create_text_key("o", "o", Qt::Key_O, Qt::NoModifier, line1);
|
|
create_text_key("p", "p", Qt::Key_P, Qt::NoModifier, line1);
|
|
auto line2 = new QHBoxLayout();
|
|
main_layout->addLayout(line2);
|
|
create_text_key("a", "a", Qt::Key_A, Qt::NoModifier, line2);
|
|
create_text_key("s", "s", Qt::Key_S, Qt::NoModifier, line2);
|
|
create_text_key("d", "d", Qt::Key_D, Qt::NoModifier, line2);
|
|
create_text_key("f", "f", Qt::Key_F, Qt::NoModifier, line2);
|
|
create_text_key("g", "g", Qt::Key_G, Qt::NoModifier, line2);
|
|
create_text_key("h", "h", Qt::Key_H, Qt::NoModifier, line2);
|
|
create_text_key("j", "j", Qt::Key_J, Qt::NoModifier, line2);
|
|
create_text_key("k", "k", Qt::Key_K, Qt::NoModifier, line2);
|
|
create_text_key("l", "l", Qt::Key_L, Qt::NoModifier, line2);
|
|
auto line3 = new QHBoxLayout();
|
|
main_layout->addLayout(line3);
|
|
auto caps_lock = new QPushButton;
|
|
line3->addWidget(caps_lock, 1);
|
|
caps_lock->setSizePolicy(size_policy);
|
|
caps_lock->setText("大写");
|
|
connect(caps_lock, &QPushButton::clicked, [this, caps_lock]() {
|
|
if (caps_lock->text() == "大写") {
|
|
for (auto child : english->findChildren<Key_Button*>()) {
|
|
if ((child->text.size() == 1) && child->text.isLower()) {
|
|
QString&& text = child->text.toUpper();
|
|
child->setText(text);
|
|
child->text = text;
|
|
}
|
|
}
|
|
caps_lock->setText("小写");
|
|
}
|
|
else {
|
|
for (auto child : english->findChildren<Key_Button*>()) {
|
|
if ((child->text.size() == 1) && child->text.isUpper()) {
|
|
QString&& text = child->text.toLower();
|
|
child->setText(text);
|
|
child->text = text;
|
|
}
|
|
}
|
|
caps_lock->setText("大写");
|
|
}
|
|
});
|
|
create_text_key("z", "z", Qt::Key_Z, Qt::NoModifier, line3);
|
|
create_text_key("x", "x", Qt::Key_X, Qt::NoModifier, line3);
|
|
create_text_key("c", "c", Qt::Key_C, Qt::NoModifier, line3);
|
|
create_text_key("v", "v", Qt::Key_V, Qt::NoModifier, line3);
|
|
create_text_key("b", "b", Qt::Key_B, Qt::NoModifier, line3);
|
|
create_text_key("n", "n", Qt::Key_N, Qt::NoModifier, line3);
|
|
create_text_key("m", "m", Qt::Key_M, Qt::NoModifier, line3);
|
|
create_text_key("Backspace", "\b", Qt::Key_Backspace, Qt::NoModifier, line3);
|
|
auto line4 = new QHBoxLayout();
|
|
main_layout->addLayout(line4);
|
|
auto change_to_123 = new QPushButton;
|
|
line4->addWidget(change_to_123, 1);
|
|
change_to_123->setSizePolicy(size_policy);
|
|
change_to_123->setText("?123");
|
|
connect(change_to_123, &Key_Button::clicked, [this, change_to_123]() {
|
|
cur_widget->hide();
|
|
symbol->show();
|
|
});
|
|
auto change_to_ch = new QPushButton;
|
|
change_to_ch->setText("中文");
|
|
change_to_ch->setSizePolicy(size_policy);
|
|
line4->addWidget(change_to_ch, 1);
|
|
connect(change_to_ch, &Key_Button::clicked, [&]() {
|
|
cur_widget->hide();
|
|
chinese->show();
|
|
cur_widget = chinese;
|
|
state = Chinese;
|
|
});
|
|
auto space = create_text_key(" ", " ", Qt::Key_Space, Qt::NoModifier, line4);
|
|
QSizePolicy size_policy1(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
|
size_policy1.setHorizontalStretch(5);
|
|
space->setSizePolicy(size_policy1);
|
|
auto hide = new QPushButton;
|
|
hide->setText("隐藏");
|
|
hide->setSizePolicy(size_policy);
|
|
line4->addWidget(hide, 1);
|
|
connect(hide, &Key_Button::clicked, this, &QWidget::hide);
|
|
return ret;
|
|
}
|
|
QWidget* create_symbol() {
|
|
auto ret = new QWidget;
|
|
auto main_layout = new QVBoxLayout(ret);
|
|
auto line1 = new QHBoxLayout();
|
|
main_layout->addLayout(line1);
|
|
create_text_key("1", "1", Qt::Key_1, Qt::NoModifier, line1);
|
|
create_text_key("2", "2", Qt::Key_2, Qt::NoModifier, line1);
|
|
create_text_key("3", "3", Qt::Key_3, Qt::NoModifier, line1);
|
|
create_text_key("4", "4", Qt::Key_4, Qt::NoModifier, line1);
|
|
create_text_key("5", "5", Qt::Key_5, Qt::NoModifier, line1);
|
|
create_text_key("6", "6", Qt::Key_6, Qt::NoModifier, line1);
|
|
create_text_key("7", "7", Qt::Key_7, Qt::NoModifier, line1);
|
|
create_text_key("8", "8", Qt::Key_8, Qt::NoModifier, line1);
|
|
create_text_key("9", "9", Qt::Key_9, Qt::NoModifier, line1);
|
|
create_text_key("0", "0", Qt::Key_0, Qt::NoModifier, line1);
|
|
auto line2 = new QHBoxLayout();
|
|
main_layout->addLayout(line2);
|
|
create_text_key("!", "!", Qt::Key_1, Qt::ShiftModifier, line2);
|
|
create_text_key("@", "@", Qt::Key_2, Qt::ShiftModifier, line2);
|
|
create_text_key("#", "#", Qt::Key_3, Qt::ShiftModifier, line2);
|
|
create_text_key("%", "%", Qt::Key_5, Qt::ShiftModifier, line2);
|
|
create_text_key("&&", "&", Qt::Key_7, Qt::ShiftModifier, line2);
|
|
create_text_key("*", "*", Qt::Key_8, Qt::ShiftModifier, line2);
|
|
create_text_key("(", "(", Qt::Key_9, Qt::ShiftModifier, line2);
|
|
create_text_key(")", ")", Qt::Key_0, Qt::ShiftModifier, line2);
|
|
create_text_key("-", "-", Qt::Key_Minus, Qt::NoModifier, line2);
|
|
auto line3 = new QHBoxLayout();
|
|
main_layout->addLayout(line3);
|
|
create_text_key("_", "_", Qt::Key_Underscore, Qt::ShiftModifier, line3);
|
|
create_text_key(":", ":", Qt::Key_Colon, Qt::ShiftModifier, line3);
|
|
create_text_key(";", ";", Qt::Key_Semicolon, Qt::NoModifier, line3);
|
|
create_text_key("/", "/", Qt::Key_Slash, Qt::NoModifier, line3);
|
|
create_text_key(".", ".", Qt::Key_Period, Qt::NoModifier, line3);
|
|
create_text_key(",", ",", Qt::Key_Comma, Qt::NoModifier, line3);
|
|
create_text_key("?", "?", Qt::Key_Question, Qt::ShiftModifier, line3);
|
|
create_text_key("Backspace", "\b", Qt::Key_Backspace, Qt::NoModifier, line3);
|
|
auto line4 = new QHBoxLayout();
|
|
main_layout->addLayout(line4);
|
|
auto back = new QPushButton;
|
|
back->setText("返回");
|
|
back->setSizePolicy(size_policy);
|
|
line4->addWidget(back, 1);
|
|
connect(back, &Key_Button::clicked, [&]() {
|
|
symbol->hide();
|
|
cur_widget->show();
|
|
});
|
|
auto space = create_text_key(" ", " ", Qt::Key_Space, Qt::NoModifier, line4);
|
|
QSizePolicy size_policy1(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
|
size_policy1.setHorizontalStretch(5);
|
|
space->setSizePolicy(size_policy1);
|
|
auto hide = new QPushButton;
|
|
hide->setText("隐藏");
|
|
hide->setSizePolicy(size_policy);
|
|
line4->addWidget(hide, 1);
|
|
connect(hide, &Key_Button::clicked, this, &QWidget::hide);
|
|
return ret;
|
|
}
|
|
};
|
|
} // namespace renderive
|