QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样(一)

19 篇文章 15 订阅
订阅专栏

一、本自制虚拟键盘特点

1.键盘界面保持在所有界面最上方。

2.点击键盘按钮不会改变底层文本输入框焦点。

3.通过模拟键盘点击事件完成键盘输入文本信息。

4.包含各种键盘自带符号输入。

5.长按按键可以持续重复输入键盘内容。

6.支持win7、win10、Linux等各个系统。

7.界面好看。

总之跟真的虚拟键盘一样,不会有不爽的地方

最新版本看这里QT自制软键盘 最完美、最简单、支持中文输入(二)

二、windows打开系统自带软键盘

QDesktopServices::openUrl(QUrl("osk.exe", QUrl::TolerantMode));

传统打开系统自带虚拟键盘的方法如上,一行代码即可,但是系统自带的虚拟键盘不一定好用,有的按键太小,有的电脑上可能没有自带的软键盘,干脆直接写一个。

三、让键盘界面保持在最上方、不改变底层界面焦点

很多自制键盘时不知道怎么使键盘保持在最顶层,发现点击键盘界面后系统焦点在键盘界面上了,光标不在底层的行输入框里,就通过输入完成后点击确定的方式将键盘内容传到底层界面,显得不nice,其实这两个问题都很简单能够解决,代码如下

this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::WindowDoesNotAcceptFocus);
Qt::WindowStaysOnTopHint 设置窗口置顶
Qt::WindowDoesNotAcceptFocus 设置无焦点窗口

四、长按按键重复输入键盘内容

特别是我们点击退格删除键时,文本比较多是我们使用真实键盘就会长按退格键把十多个文本挨个删除,而使用虚拟键盘时要按十多次退格键,显得不nice。那么我们使用QPushButton的setAutoRepeat为true,就可以实现按键长按功能了,设置重复操作延时为500ms差不多了,按下的时长超过500ms后马上再次执行按键槽函数。

pbtn->setAutoRepeat(true);    //允许自动重复
pbtn->setAutoRepeatDelay(500);//设置重复操作的时延

五、模拟键盘点击事件完成虚拟键盘输入

一些自制虚拟键盘完成键盘输入的方式是同传递文本到输入框的方式,话不多说,就是不nice。点击虚拟按键直接发送对应的按键点击事件就很nice,这样其实就不会太死,甚至中文输入也可以,我们写的是键盘,不是写中文输入法,那些下载网上含有中文输入法的库的大可不必,输入法你系统用的什么就是什么。如果你想中文输入,系统下载的有搜狗输入法,你的键盘只需按下ctrl+shift切换输入法即可,而不是在键盘里实现中文输入法的功能。那样不nice,模拟发送按键点击事件代码如下。

	QPushButton* pbtn = (QPushButton*)sender();
	if (pbtn->text() >= 'a' && pbtn->text() <= 'z') {
		QKeyEvent keyPress(QEvent::KeyPress, int(pbtn->text().at(0).toLatin1()) - 32, Qt::NoModifier, pbtn->text());
		QKeyEvent keyRelease(QEvent::KeyRelease, int(pbtn->text().at(0).toLatin1()) - 32, Qt::NoModifier, pbtn->text());
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);
	}

通过QApplication::sendEvent发送一个按键按下和按键松开的事件就相当于模拟一个按键按下事件

QKeyEvent说明:

QKeyEvent::QKeyEvent( QEvent::Type type, int key, Qt::KeyboardModifiers modifiers, const QString &text = QString(), bool autorep = false, ushort count = 1)

类型参数必须为QEvent::KeyPress、QEvent::KeyRelease或QEvent::ShortcutOverride。 

Int key是事件循环应该监听的Qt:: key的代码。 如果key为0,则事件不是已知键的结果; 例如,它可能是组合序列或键盘宏的结果。 修饰符包含键盘修饰符,给定的文本是键生成的Unicode文本。 如果autorep为真,isAutoRepeat()将为真。 Count是事件中涉及的键的数量。 

QKeyEvent在我们这里用4个参数就行了,第二个参数Qt:: key对应的按键,第四个参数是需要发送的文本,没有这个参数是无法输入任何内容的。

QApplication::sendEvent的第一个参数非常重要,是接收键盘输入的控件,比如是底层界面的lineEdit。

六、键盘符号输入

m_mapSymbolKeys.insert("~", Qt::Key_AsciiTilde);
	m_mapSymbolKeys.insert("`", Qt::Key_nobreakspace); 
	m_mapSymbolKeys.insert("-", Qt::Key_Minus);
	m_mapSymbolKeys.insert("_", Qt::Key_Underscore);
	m_mapSymbolKeys.insert("+", Qt::Key_Plus);
	m_mapSymbolKeys.insert("=", Qt::Key_Equal);
	m_mapSymbolKeys.insert(",", Qt::Key_Comma);
	m_mapSymbolKeys.insert(".", Qt::Key_Period);
	m_mapSymbolKeys.insert("/", Qt::Key_Slash);
	m_mapSymbolKeys.insert("<", Qt::Key_Less);
	m_mapSymbolKeys.insert(">", Qt::Key_Greater);
	m_mapSymbolKeys.insert("?", Qt::Key_Question);
	m_mapSymbolKeys.insert("[", Qt::Key_BracketLeft);
	m_mapSymbolKeys.insert("]", Qt::Key_BracketRight);
	m_mapSymbolKeys.insert("{", Qt::Key_BraceLeft);
	m_mapSymbolKeys.insert("}", Qt::Key_BraceRight); 
	m_mapSymbolKeys.insert("|", Qt::Key_Bar);
	m_mapSymbolKeys.insert("\\", Qt::Key_Backslash);
	m_mapSymbolKeys.insert(":", Qt::Key_Colon);
	m_mapSymbolKeys.insert(";", Qt::Key_Semicolon);
	m_mapSymbolKeys.insert("\"", Qt::Key_QuoteLeft);
	m_mapSymbolKeys.insert("'", Qt::Key_Apostrophe);

    QKeyEvent keyPress(QEvent::KeyPress, m_mapSymbolKeys.value(symbol), Qt::NoModifier, symbol);
	QKeyEvent keyRelease(QEvent::KeyRelease, m_mapSymbolKeys.value(symbol), Qt::NoModifier, symbol);
	QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);
	QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);

键盘输入特定的符号重要是找到QKeyEvent第二个参数对应的按键值即可。按键中的值被都在qnamespace.h的头文件中的enum Key枚举类型内。

七、界面

八、头文件代码

#pragma once
#pragma execution_character_set("utf-8")
#include <QDialog>
#include "ui_frmKeyBoard.h"
#include "moveWidget.h"
#include <QPushButton>
#include <QKeyEvent>
#include <QDebug>
#include <QStyle>

class frmKeyBoard : public QDialog
{
	Q_OBJECT

public:
	frmKeyBoard(QWidget *parent = nullptr);
	~frmKeyBoard();

	void initFocusWidget(QWidget*);

private slots:
	void slotKeyButtonClicked();
	void slotKeyLetterButtonClicked();
	void slotKeyNumberButtonClicked();

private:
	Ui::frmKeyBoardClass ui;
	void initFrm();
	void initStyleSheet();

	QWidget* m_focusWidget;	//键盘输入主窗口

	QVector<QPushButton*> m_letterKeys;
	QVector<QPushButton*> m_NumberKeys;

	QMap<QString, Qt::Key> m_mapSymbolKeys;

};

九、源文件代码

#include "frmKeyBoard.h"

frmKeyBoard::frmKeyBoard(QWidget *parent)
	: QDialog(parent)
{
	ui.setupUi(this);

	this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus);
	this->setWindowTitle("屏幕键盘");
	this->setWindowModality(Qt::WindowModal); 
	this->setAttribute(Qt::WA_DeleteOnClose);

	MoveWidget* moveWidget = new MoveWidget();
	moveWidget->setWidget(this);

	this->initFrm();
	this->initStyleSheet();
}

frmKeyBoard::~frmKeyBoard()
{
}

void frmKeyBoard::initFocusWidget(QWidget* widget)
{
	m_focusWidget = widget;
}

void frmKeyBoard::initFrm()
{
    ui.pushButton_closeKeyboard->setIcon(style()->standardIcon(QStyle::SP_TitleBarCloseButton));
	m_letterKeys.clear();
	m_NumberKeys.clear();
	QList<QPushButton*> pbtns = this->findChildren<QPushButton*>();
	foreach(QPushButton * pbtn, pbtns) {
		pbtn->setAutoRepeat(true);    //允许自动重复
		pbtn->setAutoRepeatDelay(500);//设置重复操作的时延

		if (pbtn->text() >= 'a' && pbtn->text() <= 'z') {
			connect(pbtn, &QPushButton::clicked, this, &frmKeyBoard::slotKeyLetterButtonClicked);
			m_letterKeys.push_back(pbtn);
		}
		else if (pbtn->text().toInt() > 0 && pbtn->text().toInt() <= 9 || pbtn->text() == "0") {
			connect(pbtn, &QPushButton::clicked, this, &frmKeyBoard::slotKeyNumberButtonClicked);
			m_NumberKeys.push_back(pbtn);
		}
		else{
			connect(pbtn, &QPushButton::clicked, this, &frmKeyBoard::slotKeyButtonClicked);
		}
	}

	m_mapSymbolKeys.insert("~", Qt::Key_AsciiTilde);
	m_mapSymbolKeys.insert("`", Qt::Key_nobreakspace); 
	m_mapSymbolKeys.insert("-", Qt::Key_Minus);
	m_mapSymbolKeys.insert("_", Qt::Key_Underscore);
	m_mapSymbolKeys.insert("+", Qt::Key_Plus);
	m_mapSymbolKeys.insert("=", Qt::Key_Equal);
	m_mapSymbolKeys.insert(",", Qt::Key_Comma);
	m_mapSymbolKeys.insert(".", Qt::Key_Period);
	m_mapSymbolKeys.insert("/", Qt::Key_Slash);
	m_mapSymbolKeys.insert("<", Qt::Key_Less);
	m_mapSymbolKeys.insert(">", Qt::Key_Greater);
	m_mapSymbolKeys.insert("?", Qt::Key_Question);
	m_mapSymbolKeys.insert("[", Qt::Key_BracketLeft);
	m_mapSymbolKeys.insert("]", Qt::Key_BracketRight);
	m_mapSymbolKeys.insert("{", Qt::Key_BraceLeft);
	m_mapSymbolKeys.insert("}", Qt::Key_BraceRight); 
	m_mapSymbolKeys.insert("|", Qt::Key_Bar);
	m_mapSymbolKeys.insert("\\", Qt::Key_Backslash);
	m_mapSymbolKeys.insert(":", Qt::Key_Colon);
	m_mapSymbolKeys.insert(";", Qt::Key_Semicolon);
	m_mapSymbolKeys.insert("\"", Qt::Key_QuoteLeft);
	m_mapSymbolKeys.insert("'", Qt::Key_Apostrophe);
}

void frmKeyBoard::initStyleSheet()
{
	QString qss;
	qss += "QWidget{ background-color:rgb(26,26,26)}";
    qss += "QPushButton{ color:white; background-color:rgb(51,51,51); height:60px; font-size:bold 15pt; border:1px solid rgb(26,26,26); border-radius: 0px; min-width:50px;}";
	qss += "QPushButton:hover{background-color:rgb(229,229,229); color:black;}";
	qss += "QPushButton:pressed,QPushButton:checked{background-color:rgb(0,118,215);}";
	qss += "#pushButton_closeKeyboard{background-color:rgba(0,0,0,0); border:0px}";
	qss += "#pushButton_closeKeyboard:hover{background-color:#b30220;}";
	qss += "#pushButton_space{min-width:500px;}";
	qss += "#pushButton_backspace,#pushButton_shift{min-width:100px;}";
	qss += "#pushButton_enter{min-width:120px;}";
	qss += "#pushButton_tab,#pushButton_ctrl{min-width:70px;}";
	qss += "#pushButton_capsLock{min-width:80px;}";
	qss += "#pushButton_up{min-width:150px;}";
	this->setStyleSheet(qss);
}

void frmKeyBoard::slotKeyButtonClicked()
{
	QPushButton* pbtn = (QPushButton*)sender();
	QString objectName = pbtn->objectName();
	if (objectName == "pushButton_closeKeyboard") {
		this->close();
		return;
	}
	if (pbtn->text().contains("Backspace")) {
		QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Backspace, Qt::NoModifier);
		QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Backspace, Qt::NoModifier);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);
	}
	else if (pbtn->text().contains("Caps")) {	
		if (pbtn->isChecked()) {
			for (auto pbtnKey : m_letterKeys) {
				pbtnKey->setText(pbtnKey->text().toUpper());
			}
		}
		else {
			for (auto pbtnKey : m_letterKeys) {
				pbtnKey->setText(pbtnKey->text().toLower());
			}
		}
	}
	else if(pbtn->text() == "Space") {
		QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Space, Qt::NoModifier, " ");
		QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Space, Qt::NoModifier, " ");
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);
	}
	else if (pbtn->text().contains("Tab")) {
		QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);
		QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Tab, Qt::NoModifier);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);
	}
	else if (pbtn->text().contains("Enter")) {
		QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier);
		QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Enter, Qt::NoModifier);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);
	}
	else if (pbtn->text().contains("Shift")) {
		if (pbtn->isChecked()) {
			for (auto pbtnKey : m_letterKeys) {
				pbtnKey->setText(pbtnKey->text().toUpper());
			}
		}
		else {
			for (auto pbtnKey : m_letterKeys) {
				pbtnKey->setText(pbtnKey->text().toLower());
			}
		}
		QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Shift, Qt::NoModifier);
		QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Shift, Qt::NoModifier);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);
	}
	else if (pbtn->text().contains("Ctrl")) {
		QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Control, Qt::NoModifier);
		QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Control, Qt::NoModifier);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);
	}
	else if (pbtn->text().contains("Win")) {
		QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Menu, Qt::NoModifier);
		QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Menu, Qt::NoModifier);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);
	}
	else if (pbtn->text().contains("Alt")) {
		QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Alt, Qt::NoModifier);
		QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Alt, Qt::NoModifier);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);
	}
	else if (pbtn->text().contains("↑")) {
		QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);
		QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Up, Qt::NoModifier);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);
	}
	else if (pbtn->text().contains("↓")) {
		QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);
		QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Down, Qt::NoModifier);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);
	}
	else if (pbtn->text().contains("←")) {
		QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier);
		QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Left, Qt::NoModifier);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);
	}
	else if (pbtn->text().contains("→")) {
		QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier);
		QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Right, Qt::NoModifier);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);
	}
	else {
		QString symbol;
		if (ui.pushButton_shift->isChecked())
			symbol = pbtn->text().split("\n").at(0);
		else
			symbol = pbtn->text().split("\n").at(1);

		QKeyEvent keyPress(QEvent::KeyPress, m_mapSymbolKeys.value(symbol), Qt::NoModifier, symbol);
		QKeyEvent keyRelease(QEvent::KeyRelease, m_mapSymbolKeys.value(symbol), Qt::NoModifier, symbol);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);
	}
	//取消组合键按下
	if (!pbtn->text().contains("Shift") && !pbtn->text().contains("Ctrl") && !pbtn->text().contains("Win") && !pbtn->text().contains("Alt")) {
		if (ui.pushButton_shift->isChecked()) {
			ui.pushButton_shift->setChecked(false);
			for (auto pbtnKey : m_letterKeys) {
				pbtnKey->setText(pbtnKey->text().toLower());
			}
		}
		if (ui.pushButton_ctrl->isChecked())
			ui.pushButton_ctrl->setChecked(false);
		if (ui.pushButton_win->isChecked())
			ui.pushButton_win->setChecked(false);
		if (ui.pushButton_alt->isChecked())
			ui.pushButton_alt->setChecked(false);
	}
}


void frmKeyBoard::slotKeyLetterButtonClicked()
{
	QPushButton* pbtn = (QPushButton*)sender();
	if (pbtn->text() >= 'a' && pbtn->text() <= 'z') {
		QKeyEvent keyPress(QEvent::KeyPress, int(pbtn->text().at(0).toLatin1()) - 32, Qt::NoModifier, pbtn->text());
		QKeyEvent keyRelease(QEvent::KeyRelease, int(pbtn->text().at(0).toLatin1()) - 32, Qt::NoModifier, pbtn->text());
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);
	}
	else if (pbtn->text() >= 'A' && pbtn->text() <= 'Z') {
		QKeyEvent keyPress(QEvent::KeyPress, int(pbtn->text().at(0).toLatin1()), Qt::NoModifier, pbtn->text());
		QKeyEvent keyRelease(QEvent::KeyRelease, int(pbtn->text().at(0).toLatin1()), Qt::NoModifier, pbtn->text());
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);
		QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);
	}
	//取消组合键按下
	if (ui.pushButton_shift->isChecked()) {
		ui.pushButton_shift->setChecked(false);
		for (auto pbtnKey : m_letterKeys) {
			pbtnKey->setText(pbtnKey->text().toLower());
		}
	}
	if (ui.pushButton_ctrl->isChecked())
		ui.pushButton_ctrl->setChecked(false);
	if (ui.pushButton_win->isChecked())
		ui.pushButton_win->setChecked(false);
	if (ui.pushButton_alt->isChecked())
		ui.pushButton_alt->setChecked(false);
}

void frmKeyBoard::slotKeyNumberButtonClicked()
{
	QPushButton* pbtn = (QPushButton*)sender();
	QKeyEvent keyPress(QEvent::KeyPress, pbtn->text().toInt() + 48, Qt::NoModifier, pbtn->text());
	QKeyEvent keyRelease(QEvent::KeyRelease, pbtn->text().toInt() + 48, Qt::NoModifier, pbtn->text());
	QApplication::sendEvent(m_focusWidget->focusWidget(), &keyPress);
	QApplication::sendEvent(m_focusWidget->focusWidget(), &keyRelease);
	//取消组合键按下
	if (ui.pushButton_shift->isChecked()) {
		ui.pushButton_shift->setChecked(false);
		for (auto pbtnKey : m_letterKeys) {
			pbtnKey->setText(pbtnKey->text().toLower());
		}
	}
	if (ui.pushButton_ctrl->isChecked())
		ui.pushButton_ctrl->setChecked(false);
	if (ui.pushButton_win->isChecked())
		ui.pushButton_win->setChecked(false);
	if (ui.pushButton_alt->isChecked())
		ui.pushButton_alt->setChecked(false);
}

十一、使用示例

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QHBoxLayout* layout = new QHBoxLayout();
    layout->setContentsMargins(0, 0, 0, 0);
    layout->addWidget(ui->pushButton, 0, Qt::AlignRight);
    ui->lineEdit->setLayout(layout);

}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    frmKeyBoard* keyBoard = new frmKeyBoard();
    keyBoard->initFocusWidget(this);
    keyBoard->show();
}

十二、效果

Qt自制虚拟键盘

 十三、资源下载

QT自制虚拟键盘,数字、字母大小写、符号等输入均包含,代码非常简单易懂

后续文章: QT自制软键盘 最完美、最简单、支持中文输入(二) 

Qt自定义软键盘
01-01
主要利用Qt事件过滤器实现的自定义软键盘: 代码主要有两个CPP文件,一个是显示主界面的CPP文件,另一个是显示软键盘的CPP文件,还可以调用显示Windows-7下或者Windows-xp下的软键盘
QT自制虚拟键盘,数字、字母大小写、符号等输入均包含,代码非常简单易懂
07-23
QT自制软键盘, 最完美、最简单、跟自带虚拟键盘一样。 特点: 1.键盘界面保持在所有界面最上方。 2.点击键盘按钮不会改变底层文本输入框焦点。 3.通过模拟键盘点击事件完成键盘输入文本信息。 4.包含各种键盘自带符号输入。 5.长按按键可以持续重复输入键盘内容。 6.支持win7、win10、Linux等各个系统。 7.界面非常好看。
QT官方软键盘
09-06
QT官方下载的软键盘程序 实现点击编辑弹出软键盘 对需要输入法的嵌入式开发有帮组
在ARM板上实现qt虚拟键盘 Qwidget实现 官方虚拟键盘、第三方虚拟键盘qtvirtualkeyboard //Qwidget最简单但效果不是最好
最新发布
2301_76250105的博客
03-04 1926
在使用qt虚拟键盘以前,我的开发qt环境中并没有安装虚拟键盘库,所以这里还会顺便介绍如何在开发板上已安装qt环境的前提下,继续更新qt的组件。开发qt版本:5.15.2。
Qt 实现虚拟键盘
weixin_42193704的博客
08-27 6159
利用重写LineEdit 然后监听鼠标点击事件,根据LineEdit 的选择控制是数字键盘还是英文数字混合键盘。 实现方式非常的简单 只需要遍历所有的按键然后绑定槽函数 void keyboardNumDialog::init() { // this->setWindowFlags(Qt::FramelessWindowHint); // this->setWindowFlags(Qt::FramelessWindowHint | Qt::Dial...
QT自制软键盘完美、最简单、支持中文输入(二)
寒木休思的博客
01-30 1860
QT自制软键盘,界面好看,代码简洁易懂,功能完整,支持中文输入,支持组合键,例如“Ctrl+C”复制粘贴操作。
QT学习】QT中使用虚拟键盘
热门推荐
ipfpm的博客
06-25 3万+
背景:QT5.10,Ubuntu16,主程序为widget。 要求:程序中需要调用打开软键盘。 方法:(1)使用QT自带软键盘插件。 (2)自己开发一个软键盘插件,然后让程序调用该插件。 (方法一)使用QT自带软键盘 (1)qt的官方帮助文档:https://doc.qt.io/qt-5/qtvirtualkeyboard-deployment-guide.ht...
QT虚拟软键盘
11-02
程序是在QT5.6的环境下编写的,理论上来说,QT4也可以运行,但我没试验。在PC机和ARM嵌入式开发板都可以完美运行。此虚拟键盘程序只包含两个文件,可以非常方便的加入到现有的工程当中。 具体看此博客http://blog.csdn.net/wzs250969969/article/details/78418725
QT实现简易软键盘
qq_51916455的博客
07-02 1658
(4)这里只使用1、2、3、r、o、o、t、del和exit这几个按钮,方便测试。exit按钮用的是toolButton,或者用noFocus策略的按钮。用noFocus的按钮应该也是可以的,不过我偶尔成功偶尔失败,还是用toolButton比较顺畅。其他按钮都是普通pushButton,都要设置成noFocus,否则会抢焦点,使得输入框无法显示。(3)将Widget拖到login和concel按钮上,然后右键Widget设置“放在前面”。Widget控件的特点是,其上的小控件都会与其镶嵌,融为一体。
Qt软键盘的实现
韩若熙的博客
12-29 3753
Qt5.8版本开始推出了基于QML实现的软键盘功能,在此之前,并没有官方版本的软键盘。本篇主要介绍Qt实现软键盘的两种方案,一种基于中文汉字数据库,一种基于谷歌拼音输入引擎。第一种中文提示有所限制,不够智能,建议使用第二种方案,Qt官方推出的软键盘也是基于谷歌拼音输入引擎实现的。
qt中文软键盘
01-07
qt实现软键盘,支持中文,英文输入,提供删除功能。运行稳定,可以移植到windows,linux上等多种系统
Qt 虚拟键盘
12-06
Qt QInputContext 收集整理
Qt交叉编译后调用软键盘,解决软键盘背景全黑的问题
05-07
Qt交叉编译aarch64-linux-gnu-运行在zynq板上,调用软键盘后背景全黑的问题。
qt模拟键盘
06-11
两套qt模拟键盘程序,一个可以用于所有的平台,包括嵌入式,另外一个只能用于嵌入式中。目前两个程序不支持中文输入。
Qt实现软键盘
06-07
Qt开发软键盘,可以实现中文,英文输入和数字输入,界面还是比较漂亮, 欢迎下载学习。点击输入框中的键盘图标,显示软键盘,再此点击键盘图标,关闭软键盘软键盘上有关闭功能,多文本框输入软键盘不会关闭。
qt软键盘实现
10-16
希望对那些想做软键盘的人有帮助,绝对可靠,已经运行好多次了
qt虚拟键盘(26键和数字键)
07-08
qt5写的虚拟键盘,具有数字键盘和全键盘两个尺寸,全键盘是26键,数字键盘是9键。按切换键可以切换键盘
QT自制键盘
10-23
应用qt5.4自己写的键盘程序,用于登录,用户名admin,密码000000.包括数字、大小写字母、特殊字符
基于Qt5的虚拟键盘
11-10
基于Qt5.4.2的虚拟键盘插件制作工程源码,可以使用谷歌拼音输入法
qt自带虚拟键盘
09-02
Qt是一个跨平台的C++开发框架,提供了大量的类库和工具,方便开发者进行图形界面的设计和实现。其中,Qt还提供了虚拟键盘库,可以在需要输入文本的场景中以键盘的形式显示在屏幕上。 Qt虚拟键盘库具有以下特点和功能: 1. 跨平台支持:Qt虚拟键盘库可以在不同的操作系统中运行,包括Windows、Linux、MacOS等,因此开发者可以轻松地实现跨平台的虚拟键盘功能。 2. 自定义键盘布局:开发者可以根据自己的需求自定义键盘的布局和样式,包括键位大小、颜色、字体等,以便适应不同的应用场景和用户需求。 3. 输入控制:虚拟键盘库提供了丰富的输入控制功能,包括对特殊字符的支持、大小写切换、输入法切换等,方便用户进行文本输入。 4. 与输入控件的集成:虚拟键盘库可以与Qt的其他输入控件无缝集成,例如文本框、文本编辑器等,使得用户可以通过虚拟键盘进行输入操作。 5. 多语言支持:虚拟键盘库支持多种语言,包括中文、英文、法文等,开发者可以根据自己的需求选择适合的语言进行输入。 总之,Qt自带虚拟键盘库为开发者提供了一个方便、灵活和跨平台的文本输入解决方案,使得开发者可以轻松地实现虚拟键盘功能,提升用户的输入体验。无论是在智能设备、嵌入式系统还是桌面应用中,都可以广泛应用该库来满足各类应用的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • VS2019 莫名其妙出现: C2059 语法错误:“}“,C2143 语法错误:缺少“;“(在“}“的前面),C2065 未定义标识符,C2039 不是““的成员等 17552
  • QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样(一) 12411
  • Qt中使用QtDataVisualization实时绘制雷达点云三维散点图 11775
  • VS2019 + QT ERROR MSB4181 “QtRunWork”任务返回了 false,但未记录错误。 7822
  • ARM + Linux + QT 智能停车收费系统 6431

分类专栏

  • QT、C++开发经验记录 19篇
  • Qt进阶之路 3篇
  • PCL激光雷达点云处理 6篇

最新评论

  • Qt中使用QtDataVisualization实时绘制雷达点云三维散点图

    boxiaoking: 博主大大,请问一下,我画三维散点图这样连接的connect(&MYThread, SIGNAL(pointdata(QVector<float>, QVector<float>, QVector<float>)),this, SLOT(drawPoint(QVector<float>, QVector<float>, QVector<float>)));数据可以读出来,但是为什么不出来点呀

  • QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样(一)

    m0_51338054: 楼主我想知道你这个中文词库是怎么找的,可以教一下吗,因为我要做一个日语的

  • Qt中使用QtDataVisualization实时绘制雷达点云三维散点图

    源客V: https://download.csdn.net/download/qq_41632571/31861075

  • Qt中使用QtDataVisualization实时绘制雷达点云三维散点图

    boxiaoking: 博主大大,请问UDPthread该怎么写呀,我的是写一个串口收发数据,想创建一个子线程收发数据,但是还是卡,可以提供一小段demo参考一下吗?

  • Html+JavaScript+Css 二手车价格评估系统设计开发

    源客V: 可以私我哈表情包

大家在看

  • MySQL慢SQL优化技术深度学习指南 3043
  • 植物神经紊乱患者情绪不好?医师表示是病带来的,不是单纯心理问题!
  • 社交媒体数据恢复:Snapchat
  • echarts笔记篇——图表的大小如何调整
  • CVE-2023-35001提权利用-前篇

最新文章

  • QT自制软键盘 最完美、最简单、支持中文输入(二)
  • qt+ffmpeg视频播放器实现音视频倍速功能
  • Qt 之 自定义json配置文件类,QJsonDocument应用
2024年1篇
2023年11篇
2022年11篇
2021年10篇

目录

目录

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源客V

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源肉桂粉是什么longbuluo南京起名大师哪个好琴行起什么名字更好用陌取起名的寓意王凯公布恋情姓李男孩起名洋气的吐槽大会第五季免费观看航迹云国际米兰老队歌工业之动力帝国汽车租赁有限公司起名创意1百分起名给姓于的男孩起名字好听ppp85唯物主义是什么意思dbf文件怎么打开给李女宝宝起名龙灵墨修路由器账号密码僵尸世界大战小说如何给软件起名宝宝起名宝典大全weather.com.cn给能源公司起名称起名字用字笔画培训工作总结神舟电脑怎么样她他社网站 起名淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化