Qt模拟键盘输入

QT开发有时候有这种需求:要求由程序模拟键盘按下。写习惯Java之类的语言了,用C++学习一下

一、Windows

keybd_event(VK_UP,0,0,0); 
keybd_event(VK_UP,0,KEYEVENTF_KEYUP,0);

二、Mac

CGEventRef key = CGEventCreateKeyboardEvent(NULL, kVK_UpArrow, true);
CGEventPost(kCGHIDEventTap, key);
CFRelease(key);

三、Linux

  1. 如果提示不存在X11/extensions/XTest.h

Ubuntu:
$ sudo apt-get install xorg-dev

CentOS:
$ sudo yum install xorg-x11*
  1. 在pro工程中添加如下的配置

PKGCONFIG += x11
LIBS += -lpthread -lXtst
CONFIG += link_pkgconfig
QMAKE_CXXFLAGS += -std=c++0x -pthread
  1. 调用时包含的头文件

#include <X11/keysym.h>
#include <X11/extensions/xtestconst.h>
#include <X11/extensions/XInput.h>
#include <X11/extensions/XTest.h>
#include <X11/Xlib.h>
  1. 调用的方法

Display  *display = XOpenDisplay(NULL);
if(display ==NULL)
       return ;
  for(int index=0; index<65536; ++index)
 {
           
      XTestFakeKeyEvent(display, XKeysymToKeycode(display,index), 1, 10);
      XFlush(display);
      XTestFakeKeyEvent(display, index, 0, 10);
      XFlush(display);
}
XCloseDisplay(display);

5.设置当前程序不抢占别的程序的输入焦点

setWindowFlags(Qt::Tool);
setAttribute(Qt::WA_X11DoNotAcceptFocus,true)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中实现虚拟键盘可以通过以下步骤: 1. 创建一个QWidget或QDialog,作为虚拟键盘的窗口。 2. 在窗口中添加多个QPushButton作为键盘的按键,可以使用Qt的布局管理器来自动排列按钮位置。 3. 为每个按钮添加响应的槽函数,以便在按下按钮时执行相应的操作,例如模拟键盘输入、控制光标位置等。 4. 可以使用Qt的信号和槽机制来将虚拟键盘与其他控件关联,例如将虚拟键盘与文本框关联,当按下虚拟键盘的按键时,自动向文本框中输入相应的文本。 5. 最后,将虚拟键盘窗口显示出来,并根据需要设置其大小、位置、样式等属性。 以下是一个简单的示例代码: ```cpp #include <QtWidgets> class VirtualKeyboard : public QDialog { Q_OBJECT public: VirtualKeyboard(QWidget *parent = nullptr); private slots: void buttonClicked(); private: QPushButton *m_buttons[10]; QPushButton *m_okButton; QPushButton *m_cancelButton; }; VirtualKeyboard::VirtualKeyboard(QWidget *parent) : QDialog(parent) { QVBoxLayout *layout = new QVBoxLayout; QGridLayout *gridLayout = new QGridLayout; for (int i = 0; i < 10; ++i) { m_buttons[i] = new QPushButton(QString::number(i), this); connect(m_buttons[i], SIGNAL(clicked()), this, SLOT(buttonClicked())); gridLayout->addWidget(m_buttons[i], i / 3, i % 3); } m_okButton = new QPushButton(tr("OK"), this); connect(m_okButton, SIGNAL(clicked()), this, SLOT(accept())); m_cancelButton = new QPushButton(tr("Cancel"), this); connect(m_cancelButton, SIGNAL(clicked()), this, SLOT(reject())); layout->addLayout(gridLayout); layout->addWidget(m_okButton); layout->addWidget(m_cancelButton); setLayout(layout); setWindowTitle(tr("Virtual Keyboard")); } void VirtualKeyboard::buttonClicked() { QPushButton *button = qobject_cast<QPushButton *>(sender()); Q_ASSERT(button != nullptr); // do something with the button text, such as simulate keyboard input QString text = button->text(); QKeyEvent keyPress(QEvent::KeyPress, text.toInt() + Qt::Key_0, Qt::NoModifier, text); QCoreApplication::postEvent(QApplication::focusWidget(), &keyPress); // move focus to the next widget QApplication::focusWidget()->focusNextPrevChild(true); } int main(int argc, char *argv[]) { QApplication app(argc, argv); QLineEdit *lineEdit = new QLineEdit; QPushButton *button = new QPushButton(tr("Show Keyboard")); QWidget::connect(button, &QPushButton::clicked, [&]() { VirtualKeyboard keyboard; if (keyboard.exec() == QDialog::Accepted) { lineEdit->setText(lineEdit->text() + " OK"); } else { lineEdit->setText(lineEdit->text() + " Cancel"); } }); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(lineEdit); layout->addWidget(button); QWidget window; window.setLayout(layout); window.show(); return app.exec(); } #include "main.moc" ``` 这个示例程序创建了一个带有10个数字按钮、OK按钮和Cancel按钮的虚拟键盘。当用户点击数字按钮时,程序会向当前焦点部件发送相应的按键事件,以模拟键盘输入。当用户点击OK或Cancel按钮时,程序会返回相应的结果。在主窗口中,点击“Show Keyboard”按钮可以显示虚拟键盘,并将其与当前的文本框关联起来。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值