Qt5 mouseless 测试

Qt开发之按键触控监测与显示 通过以上步骤,你可以在Qt应用程序中监测按键和触控事件,并及时显示相关信息。编译并运行你的程序,按下键盘键或在支持触控的设备上进行触控操作,查看。来显示按键和触控事件的信息。如果你需要监测多点触控事件,可以在。函数来监测按键按下和释放事件。中是否及时显示相应的事件信息。在上述代码中,我们使用一个。在主函数中创建并显示主窗口。中更新这个标签的内容。函数来监测触控事件。确保你的窗口部件(如。 阅读详情

最近需要在一个嵌入式设备上使用物理按键跟Qt界面交互操作,

在这种没有鼠标的情况下,写Qt程序就要小心了,有些东东能用,

有些东东不能用,一定提前得有所考虑。

简单的交互最好只使用按钮,复杂点的,因为涉及到焦点的切换。

复杂点的,如果屏幕还要弹出输入法来,就更加麻烦一些了。

上图吧。

使用事件过滤器,将窗体所有部件的事件都集中在父窗体的事件处理函数中来处理,来决定下一个焦点切换到谁身上。

为了方便在上、下、左、右四个方向进行切换,所以使用了QGridLayout.

#ifndef ZPAGE1_H
#define ZPAGE1_H

#include <QWidget>
#include <QKeyEvent>
#include <QDebug>
#include <QGridLayout>
#include <QToolButton>
class ZPage1 : public QWidget
{
    Q_OBJECT

public:
    ZPage1(QWidget *parent = 0);
    ~ZPage1();

protected:
    bool eventFilter(QObject *obj, QEvent *event);
private slots:
    void ZSlotBtnClicked();
private:
    QGridLayout *m_gridLayout;
    QToolButton *m_btnArray[20];
};

#endif // ZPAGE1_H

#include "zpage1.h"

ZPage1::ZPage1(QWidget *parent)
    : QWidget(parent)
{
    this->setStyleSheet("QToolButton{width:50px;height:30px;}");
    this->m_gridLayout=new QGridLayout;
    qint32 tX=0;
    qint32 tY=0;
    for(qint32 i=0;i<20;i++)
    {
        this->m_btnArray[i]=new QToolButton;
        this->m_btnArray[i]->installEventFilter(this);
        this->m_btnArray[i]->setText(QString("%1").arg(i+1));
        this->m_gridLayout->addWidget(this->m_btnArray[i],tX,tY);
        if(tX++>=5)
        {
            tY++;
            tX=0;
        }
        connect(this->m_btnArray[i],SIGNAL(clicked()),this,SLOT(ZSlotBtnClicked()));
    }
    this->setLayout(this->m_gridLayout);
}

ZPage1::~ZPage1()
{
    for(qint32 i=0;i<20;i++)
    {
        delete this->m_btnArray[i];
    }
    delete this->m_gridLayout;
}
void ZPage1::ZSlotBtnClicked()
{
    QToolButton *btn=qobject_cast<QToolButton*>(sender());
    if(btn)
    {
        qDebug()<<"Button Clicked:"<<btn->text();
    }
}

bool ZPage1::eventFilter(QObject *obj, QEvent *event)
{
    if(event->type()==QEvent::KeyPress)
    {
        qint32 tCurFocusX;
        qint32 tCurFocusY;
        for(qint32 i=0;i<this->m_gridLayout->rowCount();i++)
        {
            bool bFindIt=false;
            for(qint32 j=0;j<this->m_gridLayout->columnCount();j++)
            {
                QLayoutItem *tItem=this->m_gridLayout->itemAtPosition(i,j);
                if(!tItem)
                {
                    continue;
                }
                QWidget *tFocusWidget=tItem->widget();
                if(tFocusWidget && tFocusWidget==this->focusWidget())
                {
                    qDebug()<<"oldPos:"<<i<<j;
                    tCurFocusX=i;
                    tCurFocusY=j;
                    bFindIt=true;
                    break;
                }
            }
            if(bFindIt)
            {
                break;
            }
        }

        QKeyEvent *tKeyEvent=static_cast<QKeyEvent*>(event);
        switch(tKeyEvent->key())
        {
        //"Return" is the left area Enter key,"Enter" is the right digital area Enter key.
        //they are different.
        //case Qt::Key_Enter:
        case Qt::Key_Return:
        {
            qDebug()<<"return";
            QLayoutItem *tNewItem=this->m_gridLayout->itemAtPosition(tCurFocusX,tCurFocusY);
            if(tNewItem)
            {
                QToolButton *tBtn=qobject_cast<QToolButton*>(tNewItem->widget());
                if(tBtn)
                {
                    emit tBtn->click();
                    return true;
                }
            }
        }

        case Qt::Key_Up:
            qDebug()<<"up";
            if(tCurFocusX>0)
            {
                tCurFocusX--;
            }
            break;
        case Qt::Key_Down:
            qDebug()<<"down";
            if(tCurFocusX<this->m_gridLayout->rowCount()-1)
            {
                tCurFocusX++;
            }
            break;
        case Qt::Key_Left:
            qDebug()<<"left";
            if(tCurFocusY>0)
            {
                tCurFocusY--;
            }
            break;
        case Qt::Key_Right:
            qDebug()<<"right";
            if(tCurFocusY<this->m_gridLayout->columnCount()-1)
            {
                tCurFocusY++;
            }
            break;
        default:
            break;
        }
        qDebug()<<"newPos:"<<tCurFocusX<<tCurFocusY;
        QLayoutItem *tNewItem=this->m_gridLayout->itemAtPosition(tCurFocusX,tCurFocusY);
        if(tNewItem)
        {
            tNewItem->widget()->setFocus();
        }
        //we already handle this event,so return false.
        //this cause qt do not call other event handler.
        return true;
    }
    return false;
}

慢慢看吧,亲们,不过有个小问题要注意,就是PC兼容的键盘上有2个回车键,左边常用区域叫Return,右边数字区域叫Enter,

没错,Qt5是这样编码的。

好了,剩下的工作就是开始我的嵌入式GUI规则了。包括功能实现,以及与按键互动。

QT5.14入门教程GUI(二)第2个QT程序-按钮 QT5.14入门教程GUI(二)第2个QT程序-按钮 按钮的添加,共2种方式; 一、第一种,普通直接添加点击事件处理; 1、新建项目,改名称Button; 2、改类名,我就不改了; 3、打开UI界面,双击; 4、找到左侧,按钮,如下;单击,拖到右侧界面中释放; 5、双击,改名称;按钮1; 6、右键单击,按钮1;如下,选择——转到槽; 7、选择槽函数,... 阅读详情

相关推荐

通过QT实现使用两个界面里的按钮,进行切换界面

通过QT实现使用两个界面里的按钮,进行切换界面

Aungtoin的博客 1748

Qt中利用一个按键实现子窗口的显示和关闭

文件目录以及主窗口widget.h 首先给项目添加新的项,这样的到下面的目录,在原来的主窗口 的*.h文件中添加两行代码: 主窗口widget.cpp //主窗口 widget.cpp Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); this->resize(600,400);//主窗口大小调整 QPushButton

qq_44424620的博客 4280

QT实战——界面切换

QT简单的实现按钮进行界面切换

weixin_44898655的博客 2995

树莓派+QT+机械按键操作GUI界面

树莓派+QT+机械按键操作GUI界面项目介绍界面设计功能设计设置GPIO开启任务并实时更新数据文本框选择功能加一减一功能实现效果 项目介绍 通过树莓派上的I/O输入来控制GUI界面。 用QT设置三个文本框,其中两个可显示当前被操作后的数字,第三个显示当前被选择的文本框编号。用四根杜邦线将树莓派上的四根I/O引脚和机械按钮连接,其中两个可以用于向左或向右选择文本框,另外两个用于增减数,一个可以加一操...

STAR GAME 3866

qt触摸屏调试(tslib1.21 + qt5.12.9)

过程是痛苦的,因为之前没调试过qt,也没啥总结的,可能换个设备还是慢慢摸索调试 前文已介绍了如果编译 tslib和qt 且非常详细;那个步骤现在看没有问题 我在调试qt的时候 翻看了好多遍前文编译的库,看编译过程是否有问题;;;;我这不叫写文章 叫笔记 1.配置文件 这个在/etc/profile 中, 对tslib的一些配置; export TSLIB_ROOT=/路径/tslib #设置一个根目录,方便更改 export TSLIB_TSDEVICE=/dev

u013921164的博客 5814

Linux系统搭建OpenClaw(原Clawdbot)全流程指南 最新版

工具定位:开源个人 AI 助手,支持文件读取、命令执行、多渠道交互(Telegram / 本地终端等);系统要求:主流 Linux 发行版(Ubuntu/Debian/CentOS 等),Node.js ≥22(核心依赖);安全提示:OpenClaw 为测试版,具备高权限操作能力,建议使用非主力机,配置权限白名单,避免接触敏感数据。

AI时代老码农的第二春 6559

qt5 mouseless 多子页面切换测试

#ifndef ZPAGE1_H #define ZPAGE1_H #include #include #include #include #include #include class ZPage1 : public QWidget {     Q_OBJECT public:     ZPage1(QWidget *parent = 0);

烟台 嵌入式产品开发 941

树莓派国内镜像源一键配置指南

本文提供树莓派国内镜像源一键配置指南,解决默认国外源访问缓慢问题。通过自动检测系统版本并支持清华、阿里云、中科大等主流镜像站选择,大幅提升软件更新与安装速度。包含详细的手动配置方法和常见问题排查,帮助用户快速完成树莓派换源优化。

tequila的博客 1373

Qt键盘驱动映射及简单ui界面

实现的代码存放在http://download.youkuaiyun.com/detail/lzh445096/8767199 1.qt键盘驱动映射的实现(kbdhander.h   kbdhander.c) qt的键盘驱动通常使用一个QsocketNotifier类的对象来检测通过open系统调用打开的键盘设备文件。QsocketNotifier会调用键盘在linux内核空间的fil

lzh445096的博客 3020

瑞芯微RK3568与RK3566芯片选型指南:从接口差异到应用场景深度解析

在嵌入式系统与边缘计算领域,芯片选型是决定产品成败的关键一步。其核心在于理解芯片的架构、接口扩展能力与系统可靠性之间的平衡。以瑞芯微(Rockchip)的RK3568和RK3566为例,这两款同为四核A55架构的芯片,在基础算力上相近,但其面向的应用赛道却因接口配置而截然不同。RK3568凭借其双千兆网口、PCIe 3.0高速接口以及全链路ECC内存支持,在技术价值上更侧重于构建高可靠、高扩展性的系统,如边缘计算网关、工业控制器和网络视频录像机(NVR)。相比之下,RK3566则以其精简的接口配置,精准服务

weixin_33314040的博客 478

【MATLAB代码】基于水声通信(ACOMMS)下的到达时间差(TDOA)定位的AUV自主导航例程,附完整代码

水下AUV导航系统仿真研究 本研究基于到达时间差(TDOA)技术实现了水下自主航行器(AUV)的三维导航仿真系统。系统采用四个声学信标作为定位基准,通过TDOA测量数据迭代求解AUV位置。仿真结果表明: 导航性能:系统能够有效跟踪AUV从起点(30,30,-20)到目标点(70,70,-20)的航行轨迹,定位误差保持在合理范围内。 误差分析:定位误差变化曲线显示系统具有稳定的定位精度,平均误差为0.5米左右。 技术特点:采用两步最小二乘迭代算法求解非线性TDOA方程,提高了定位精度和计算效率。 该仿真系统为

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 320

【Qt】Qt 开发桌面程序 ( Qt 版本 5.14.2 | 编辑 Qt 桌面按钮控件 | 修改按钮文本 | 为按钮添加点击事件 | 系统调用 | 去掉系统调用命令窗口 )

一、添加按钮控件、 二、修改按钮文本、 三、为按钮添加点击事件 ( 弹出对话框 )、 四、为按钮添加点击事件 ( 打开记事本 )、 五、为按钮添加点击事件 ( 打开计算器 )、 六、去掉系统调用时弹出的 cmd 命令行窗口、 七、博客资源

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2044

YOLO26 终极蒸馏指南:从入门到 SOTA (The Ultimate Distillation Guide)

《YOLO26 蒸馏技术指南》深入解析了知识蒸馏在目标检测中的应用,提出五大蒸馏范式:响应蒸馏(学习最终输出)、特征蒸馏(模仿中间特征)、关系蒸馏(捕捉通道关联)、CWD(通道语义对齐)和FGD(前景背景分离)。实验表明,"Response KD + CWD + FGD"组合效果最佳,使YOLO26n在0.5ms推理速度下达到0.956 mAP50,甚至超越教师模型。指南提供模块化代码实现和超参数调优建议,强调蒸馏能平衡模型精度与效率,是轻量化部署的有效方案。

weixin_51988935的博客 717

QT 软键盘,物理键盘的完美实现

QT 软键盘的更加完美实现 首先是软键盘的显示widget类,该类主要是用于绘制软键盘 inputwidget.h view plaincopy to clipboardprint? /*************************************************************************************************

xingfeng2010的专栏 5008

CTK Plugin Framework插件框架学习1--Qt编译CTK

【代码】Qt编译CTK。

贝勒里恩的博客 7430

STM32H750VB与AD5292通讯,写入阻值后,AD5292 的阻值没有变化,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1097

嵌入式Linux使用Qt Quick实现触摸屏测试,亲测可用

嵌入式Linux使用Qt Quick实现触摸屏测试

波塞冬的博客 4611

SAP_MM&FI模块-质保金标准解决方案详解

主要讲述了SAP系统质保金的标准实现方案,包含业务背景、后台配置、前台业务操作记录,以及关键点的AI解释;

风沙的博客 681

qt界面不显示鼠标

QCursor::setShape(Qt::BlankCursor);

mmdev 459

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Qt实现触摸屏校准界面

Qt4.8.6 arm 平台 根据qt-everywhere-opensource-src-4.8.6/examples/qws/mousecalibration 示例修改calibration.h#ifndef CALIBRATION_H #define CALIBRATION_H #include &lt;QDialog&gt; #include &lt;QWSPointerCalibrat...

zestroly的博客 6621

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

QTcpSocket在收到disconnect数据丢失的问题

最近在使用Qt做一个GUI,用于结合MySQL进行pdf类型的生产工艺文件的存储,将路径和文件名放到Mysql中,将文件存在文件系统中, 本来想使用ftp来做的,后来想了想,麻烦,就自己做了一个C/S来实现。 主要实现3种操作就可以:     enum{         ZPacket_Upload_File=0x1101,// 上传文件         ZPacket_Download

烟台 嵌入式产品开发 4146

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

制作图像素材时,背景图片中的区域位置坐标定位

为了美观,使用贴图进行美化时,往往需要定位控件的位置,此时用 gimp打开,使用矩形选择工具,框出来在左侧就能显示出来。 在这里我们得知,此矩阵的绝对坐标为(133,104) 尺寸为(208,27),这样在代码中可以直接将QLineEdit定位到此处。 现实中,图片往往由美工提供,相应的也会提供坐标尺寸的,所以一般不用自己测量。俺这是没有办法,一人抗战到底。 shell.albert@gma

烟台 嵌入式产品开发 1808

UI中经过需要临时new对象,那么该如何delete呢?

在一个项目中使用QTabWidget,需要时不时的new出一个新的对象,并使用addTab()添加上去,但是这个new的对象该如何删除呢? 就必须保存好这个指针,以便不需要的时候delete掉。 在QTabWidget的时候,可以不用管这个指针,应该当addTab后,它就由QTabWidget接管了,QTabWidget会保存这个指针的。 当我们想关闭一个Tab时,会emit tabClos

烟台 嵌入式产品开发 1645
上一篇: input core输入事件 矩阵键盘 映射 原理分析
下一篇: qt5 mouseless 多子页面切换测试
Yantai666
博客等级 码龄15年 45粉丝 271原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值