关于qt键盘的问题,如何解决?

问题遇到的现象和发生背景

在qt的ui界面设置一个按键button,当按键点击一次时,可以发出和键盘按下某个键时相同的信号,并且该信号可以传递给visualboyadvance模拟器以此来控制模拟器游戏的运行,通过在qt设置按键来代替实际的键盘

操作环境、软件版本等信息

操作环境:Ubuntu16.04
软件版本:qt5.5.1 visualboyadvance-m-2.1.1

我想要达到的结果

img

  • 这篇文章讲的很详细,请看:qt 中给 按纽(button) 填充图片的方法
  • 除此之外, 这篇博客: Qt控件大致介绍以及Qt的窗口提示集合中的 1.1 按钮组(Buttons) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 按钮组包括的按钮有:

    • Push Button: 按钮

    • Tool Button: 工具按钮

    • Radio Button: 单选按钮

    • Check Box: 复选框

    • Command Link Button: 命令链接按钮

    • Dialog Button Box: 对话框按钮盒

    下面以QPushButton举例介绍一下按钮的用法。

        #include<PushButton>
        //主要代码 后续 会将源码上传的 目前还在整理
        setMinimumSize(200,120);
        setMaximumSize(200,120);
        QPushButton *quit = new QPushButton("Quit",this);
        quit->setGeometry(62,40,75,30);
        quit->setFont(QFont("Times",18,QFont::Bold));
        connect(quit,SIGNAL(clicked()),this,SLOT(close()));
    

    如图

    image.png

    点击按钮会关闭此窗口

  • 以下回答由chatgpt基于相关博客总结生成:

    根据问题内容,可以分为两个部分来解决这个问题: 1. 在Qt的UI界面中设置一个按键button来发出和键盘按下某个键时相同的信号。 2. 将该信号传递给visualboyadvance模拟器,以控制模拟器游戏的运行。

    以下是具体的解决方案:

    1. 在Qt的UI界面中设置一个按键button来发出信号。使用QPushButton来创建一个按键button,在点击该按键时会发出信号。
    // 创建一个按键button
    QPushButton *button = new QPushButton("Press Me", this);
    
    // 连接button的clicked信号和自定义槽函数
    connect(button, &QPushButton::clicked, this, &MainWindow::handleButton);
    

    上述代码中,button是一个指向QPushButton的指针,"Press Me"是按键上显示的文本。handleButton是自定义的槽函数,用于处理当按键被点击时的操作。

    1. 将发出的信号传递给visualboyadvance模拟器。这一部分的解决方案与操作系统有关,以下是在Ubuntu 16.04系统上使用VisualBoyAdvance-M 2.1.1的解决方案。

    首先,安装xdotool工具,用于模拟键盘按键事件。

    sudo apt-get install xdotool
    

    然后,在自定义的槽函数handleButton中使用xdotool来模拟键盘按键事件,发送指定的按键到visualboyadvance模拟器窗口。

    void MainWindow::handleButton()
    {
        // 使用xdotool发送键盘按键事件
        QProcess::execute("xdotool", {"search", "--onlyvisible", "--class", "VisualBoyAdvance-M", "key", "space"});
    }
    

    上述代码中,"VisualBoyAdvance-M"是visualboyadvance模拟器窗口的类名。"space"是要模拟的键盘按键,这里以空格键为例。你可以根据需要修改这些参数。

    通过以上的解决方案,你可以在Qt中设置一个按键button来控制模拟器游戏的运行。当你点击该按键时,会模拟键盘按下相应的键,并将该事件发送给visualboyadvance模拟器窗口,从而实现对模拟器游戏的控制。

我只知道windows 上的 有个 API 叫 keybd_event , 你去查一下 linux 的对应 api 吧,这个我也不清楚

void MyWidget::handleButtonClick() {
    // 模拟按下键盘按键
    keybd_event(VK_KEY, 0, 0, 0); // VK_KEY是键盘按键的虚拟键码

    // 模拟释放键盘按键
    keybd_event(VK_KEY, 0, KEYEVENTF_KEYUP, 0);
}

要么点击按钮发送键盘点击事件,要么点击按键调用按钮触发的槽函数