首页 > 其他分享 >【Qt笔记】键盘控制Qt按钮

【Qt笔记】键盘控制Qt按钮

时间:2024-08-15 16:59:03浏览次数:8  
标签:clicked Qt currentButton button 键盘 QString QPushButton 按钮

目录

一、前言

二、初始化

三、键盘移动后需要选中哪个按钮

四、键盘按键处理函数

五、实现效果


一、前言

Qt框架支持通过键盘输入来间接控制界面元素,如按钮,实现无需鼠标操作的交互方式。这通常涉及到键盘事件的监听与处理,比如监听特定的按键事件(如空格键、回车键等),并在这些事件发生时模拟鼠标点击行为,触发按钮的点击事件。本文通过重写键盘事件处理函数keyPressEvent来实现这一功能,从而为应用程序添加更丰富的交互体验和便捷性。

二、初始化

创建多个按钮并添加到网格布局中,并将按钮的点击信号与槽函数相连接,以方便后续验证键盘控制效果。

// 创建网格布局
QGridLayout *grid = new QGridLayout(this);

// 创建按钮
QPushButton *button1 = new QPushButton("按钮1");
QPushButton *button2 = new QPushButton("按钮2");
QPushButton *button3 = new QPushButton("按钮3");
QPushButton *button4 = new QPushButton("按钮4");

//链接按钮点击信号与槽函数
connect(button1, &QPushButton::clicked, this, &Widget::Button_clicked);
connect(button2, &QPushButton::clicked, this, &Widget::Button_clicked);
connect(button3, &QPushButton::clicked, this, &Widget::Button_clicked);
connect(button4, &QPushButton::clicked, this, &Widget::Button_clicked);

// 将按钮添加到网格布局
grid->addWidget(button1, 0, 0); // 将button1添加到第0行第0列
grid->addWidget(button2, 0, 1); // 将button2添加到第0行第1列
grid->addWidget(button3, 1, 0); // 将button3添加到第1行第0列
grid->addWidget(button4, 1, 1); // 将button3添加到第1行第1列

 设置按钮的objectname,并将按钮保存到QList中去,方便后续键盘控制按钮时知道需要控制哪个按钮。

//设置button的objectname
button1->setObjectName(QString("button-0-0"));
button2->setObjectName(QString("button-0-1"));
button3->setObjectName(QString("button-1-0"));
button4->setObjectName(QString("button-1-1"));

//将按钮添加到QList中去
buttons << button1 << button2 << button3 << button4;

初始化的整体代码:

//键盘控制按钮的选中
void Widget::keyboardChoose()
{
    // 创建网格布局
    QGridLayout *grid = new QGridLayout(this);

    // 创建按钮
    QPushButton *button1 = new QPushButton("按钮1");
    QPushButton *button2 = new QPushButton("按钮2");
    QPushButton *button3 = new QPushButton("按钮3");
    QPushButton *button4 = new QPushButton("按钮4");

    //链接按钮点击信号与槽函数
    connect(button1, &QPushButton::clicked, this, &Widget::Button_clicked);
    connect(button2, &QPushButton::clicked, this, &Widget::Button_clicked);
    connect(button3, &QPushButton::clicked, this, &Widget::Button_clicked);
    connect(button4, &QPushButton::clicked, this, &Widget::Button_clicked);

    //设置button的objectname
    button1->setObjectName(QString("button-0-0"));
    button2->setObjectName(QString("button-0-1"));
    button3->setObjectName(QString("button-1-0"));
    button4->setObjectName(QString("button-1-1"));

    //将按钮添加到QList中去
    buttons << button1 << button2 << button3 << button4;

    // 将按钮添加到网格布局
    grid->addWidget(button1, 0, 0); // 将button1添加到第0行第0列
    grid->addWidget(button2, 0, 1); // 将button2添加到第0行第1列
    grid->addWidget(button3, 1, 0); // 将button3添加到第1行第0列
    grid->addWidget(button4, 1, 1); // 将button3添加到第1行第1列

    //设置按钮边界
    down = 1;
    right = 1;

    // 初始选中第一个按钮
    currentButton = buttons[0];
    currentButton->setStyleSheet("QPushButton:focus { background-color: yellow; }");
}

三、键盘移动后需要选中哪个按钮

通过遍历之前保存button的QList,比较每个button的objectname属性,找到需要选中的那个按钮

QPushButton* Widget::judgeMove(QString newButtonName)
{
    QPushButton *button = nullptr;
    for(auto it : buttons)
    {
        if(it->objectName() == newButtonName)
        {
            button = it;
        }
    }
    return button;
}

四、键盘按键处理函数

本文将W键设置为上,S键设置为下,A键设置为左,D键设置为右,Enter键设置为点击按钮

//键盘按键处理函数
void Widget::keyPressEvent(QKeyEvent *event)
{
    QStringList list = currentButton->objectName().split("-");
    switch (event->key()) {
    case Qt::Key_W:
        //up
        if (list.at(1).toInt() > 0) {
            currentButton->setStyleSheet("");
            QString newButtonName = QString("button-%1-%2").arg(list.at(1).toInt() - 1).arg(list.at(2));
            currentButton = judgeMove(newButtonName);
            if(currentButton)
            {
                currentButton->setStyleSheet("QPushButton:focus { background-color: yellow; }");
                currentButton->setFocus();
            }
        }
        break;
    case Qt::Key_S:
        //down
        if (list.at(1).toInt() < down) {
            currentButton->setStyleSheet("");
            QString newButtonName = QString("button-%1-%2").arg(list.at(1).toInt() + 1).arg(list.at(2));
            currentButton = judgeMove(newButtonName);
            if(currentButton)
            {
                currentButton->setStyleSheet("QPushButton:focus { background-color: yellow; }");
                currentButton->setFocus();
            }
        }
        break;
    case Qt::Key_A:
        //left
        if (list.at(2).toInt() > 0) {
            currentButton->setStyleSheet("");
            QString newButtonName = QString("button-%1-%2").arg(list.at(1)).arg(list.at(2).toInt() - 1);
            currentButton = judgeMove(newButtonName);
            if(currentButton)
            {
                currentButton->setStyleSheet("QPushButton:focus { background-color: yellow; }");
                currentButton->setFocus();
            }
        }
        break;
    case Qt::Key_D:
        //right
        if (list.at(2).toInt() < right) {
            currentButton->setStyleSheet("");
            QString newButtonName = QString("button-%1-%2").arg(list.at(1)).arg(list.at(2).toInt() + 1);
            currentButton = judgeMove(newButtonName);
            if(currentButton)
            {
                currentButton->setStyleSheet("QPushButton:focus { background-color: yellow; }");
                currentButton->setFocus();
            }
        }
        break;
    case 16777220:
        //Enter
        currentButton->click();
        break;
    default:
        QWidget::keyPressEvent(event);
    }
}

五、实现效果

标签:clicked,Qt,currentButton,button,键盘,QString,QPushButton,按钮
From: https://blog.csdn.net/qq_52924376/article/details/141225062

相关文章

  • qt 5.12测试openssl报错
    //看看是否配置了sslQNetworkAccessManager*manager=newQNetworkAccessManager(this);qDebug()<<manager->supportedSchemes();qDebug()<<QSslSocket::sslLibraryBuildVersionString();使用以上打印出当前组件以及需要的openssl版本 ("ftp","file",......
  • 点击识别按钮调用后端接口,中途按下结束识别,但是识别还是进行啦js
    在JavaScript中,如果你想要在点击按钮后调用一个接口,并且在这个过程中按下一个按钮来中断或取消这个请求,你可以使用fetchAPI来发起请求,并使用AbortController来取消这个请求。以下是一个简单的例子://获取按钮元素conststartButton=document.getElementById('startButton');......
  • Qt5编译qmqtt库使用MQTT协议连接华为云IOT完成数据上传与交互
    一、前言随着物联网技术的发展,越来越多的设备通过网络互相连接,形成了庞大的智能系统。这些系统能够收集、分析并响应各种数据,从而实现自动化控制和智能化管理。在这个背景下,MQTT成为了一个广泛使用的轻量级消息传输协议,特别适用于资源受限的环境,如移动应用或远程传感器网......
  • QT翻金币小游戏
    目录QT翻金币小游戏效果展示图片视频实现代码main.cpp mymainwindow.hmymainwindow.cpp startscene.hstartscene.cppselectscene.cppplayscene.hplayscene.cpp mypushbutton.h mypushbutton.cppdataconfig.hdataconfig.cppQT翻金币小游戏效果展示图......
  • Qt/C++地图坐标纠偏/地球坐标系/火星坐标系/百度坐标系/互相转换/离线函数
    一、前言说明为什么需要地球坐标纠偏这个功能,因为国家安全需要,不允许使用国际标准的地球坐标系,也并不是咱们这边这样,很多国家都是这样处理的,就是本国的地图经纬度坐标都是按照国家标准来的,所以就需要一个转换。国内主要有三种坐标系,国际标准用的地球坐标系WGS-84,国家标准用的火星......
  • 【Qt】QWidget的windowIcon属性
    QWidget的windowIcon属性windowIcon表示窗口的图标当我们使用默认的windowIcon的时候,其窗口的图标如下:API说明windowIcon()获取到控件的窗⼝图标.返回QIcon对象.setWindowIcon(constQIcon&icon)设置控件的窗⼝图标.在Qt中,Qt把涉及到的相关概念,都封装成了类,Q......
  • Qt Socket状态
    在Qt中,QTcpSocket类用于TCP网络编程,它提供了丰富的接口来管理TCP连接。要判断QTcpSocket的连接状态,可以使用state()方法,该方法返回一个QAbstractSocket::SocketState枚举值,表示当前的连接状态。以下是一些常见的连接状态及其对应的枚举值:QAbstractSocket::UnconnectedSta......
  • 按钮(Buttons)-Qt-思维导图-学习笔记
    按钮(Buttons)按钮在Qt中的重要性按钮是Qt中最常用的控件之一通过点击按钮,可以响应事件,实现人机交互效果按钮在嵌入式系统和PC端的界面交互中都是不可或缺的Qt内置的六种按钮部件QPushButton:下压按钮用法示例项目创建与设置项目名称:创建一个名为04_qp......
  • ptqt5 打包把资源文件合进exe文件中 单个exe文件即可
    目录安装PyInstaller项目结构编写spec文件修改代码以嵌入资源打包应用程序解释检查打包结果使用PyQt5开发的应用程序可以通过PyInstaller工具打包成单个可执行文件(exe),并将所有资源文件(如图像、图标、样式表等)嵌入到exe文件中。以下是如何实现这一目标的详......
  • Umi4菜单栏将collapse按钮放置底部
    背景Umi@4中菜单栏的collapse按钮默认不在菜单栏底部,需求要将该按钮放回菜单底部并且改变默认icon 一开始做法直接修改组件样式,将其放置到菜单组件底部但是无法修改icon不想使用伪元素去重写icon,而且无法做到不同状态不同icon.ant-pro-sider-collapsed-button{......