当前位置: 首页 > news >正文

QT跨平台应用程序开发框架(5)—— 常用按钮控件

目录

一,Push Button

1.1 QAbstractButton

1.2 给按钮加图标

1.3 给按钮添加快捷键

二,Radio Button

2.1 介绍

2.2 另几个槽函数 

2.3 模拟点餐

三,Check Button

四,补充


前言:后面我们会依次介绍按钮类、显示类、输入类等各种控件,上篇文章介绍的 QWidget 中的各种属性、API使用等,对于后面介绍的各种 Qt 控件都是有效的

一,Push Button

1.1 QAbstractButton

QPushButton 表示一个按钮,我们前面使用过很多次,继承自 QAbstractButton,这个类是一个抽象类,是其他按钮的父类,如下图:

关于抽象类:c++面向对象三大特性——多态_c++三大特性实例-CSDN博客

是一个包含纯虚函数的类,无法创建出实例,仅仅是为了被派生类继承

并且派生类继承后后也不能实例化出对象。只有重写虚函数派生类才能实例化出对象

QPushButton本身没有什么很重要的属性,因为重要的属性大多数都包含在父类 QAbstractButton中,如下列表:

属性说明
text按钮中的文本
icon按钮中的图标
iconSize按钮中图标的尺寸
shortCut按钮对应的快捷键
autoRepeat

按钮能否重复触发,就是按住鼠标左键不松开时:

设为true:会持续产生点击事件

设为false:只有释放鼠标,再次点击时才会触发事件

autoRepeatDelay重复触发的延迟时间,长按按钮多久之后,开始重复触发
autoRepeatInterval重复触发的周期

1.2 给按钮加图标

首先是准备一张图片,用的还是 qrc 机制,这里不再赘述

先创建一个按钮,然后用代码添加图片:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QIcon icon(":/deepseek.png"); //创建图标对象ui->pushButton->setIcon(icon); //设置图标ui->pushButton->setIconSize(QSize(50, 50)); //设置图标大小
}

1.3 给按钮添加快捷键

我们之前写过一个例子,就是通过四个按钮来实现按钮的四个方向的移动的,那个是通过鼠标点击的,那么这次我们可以引入快捷键来操作,我们使用我们打游戏时常用的 WSAD 四个方向键作为快捷键

首先创建一些按钮,如下:

我已经提前搞好了四个方向的图片 

然后我们台南佳快捷键的 API 是 setShortcut :

关于 QKeySequence 对象:

  • key表示按键,sequence 表示序列,也就是顺序表
  • 因为我们按下的快捷键不一定是单个按键,也可能是两个的或三个以上的组合键

 如下Widget.cpp 的代码:

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QLabel>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//先设置这些按钮的图标,可以使用匿名对象ui->pushButton_target->setIcon(QIcon(":/deepseek.png"));ui->pushButton_target->setIconSize(QSize(80, 80));ui->pushButton_up->setIcon(QIcon(":/direction/up.png"));ui->pushButton_up->setIconSize(QSize(50, 50));ui->pushButton_down->setIcon(QIcon(":/direction/down.png"));ui->pushButton_down->setIconSize(QSize(50, 50));ui->pushButton_left->setIcon(QIcon(":/direction/left.png"));ui->pushButton_left->setIconSize(QSize(50, 50));ui->pushButton_right->setIcon(QIcon(":/direction/right.png"));ui->pushButton_right->setIconSize(QSize(50, 50));//添加快捷键,直接写字母或者组合键时容易写错
//    ui->pushButton_up->setShortcut(QKeySequence("ctrl + w"));
//    ui->pushButton_down->setShortcut(QKeySequence("ctrl + s"));
//    ui->pushButton_left->setShortcut(QKeySequence("ctrl + a"));
//    ui->pushButton_right->setShortcut(QKeySequence("ctrl + d"));//还可以通过按键的枚举来设置快捷键按键ui->pushButton_up->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_W));ui->pushButton_down->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_S));ui->pushButton_left->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_A));ui->pushButton_right->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_D));//开启鼠标点击的连发功能(键盘快捷键默认就是连发模式)ui->pushButton_up->setAutoRepeat(true);ui->pushButton_down->setAutoRepeat(true);ui->pushButton_left->setAutoRepeat(true);ui->pushButton_right->setAutoRepeat(true);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_up_clicked()
{QRect rect = ui->pushButton_target->geometry(); //获取 target 的位置ui->pushButton_target->setGeometry(rect.x(), rect.y() - 10, rect.width(), rect.height());
}void Widget::on_pushButton_down_clicked()
{QRect rect = ui->pushButton_target->geometry(); //获取 target 的位置ui->pushButton_target->setGeometry(rect.x(), rect.y() + 10, rect.width(), rect.height());
}void Widget::on_pushButton_left_clicked()
{QRect rect = ui->pushButton_target->geometry(); //获取 target 的位置ui->pushButton_target->setGeometry(rect.x() - 10, rect.y(), rect.width(), rect.height());
}void Widget::on_pushButton_right_clicked()
{QRect rect = ui->pushButton_target->geometry(); //获取 target 的位置ui->pushButton_target->setGeometry(rect.x() + 10, rect.y(), rect.width(), rect.height());
}

效果如下:

二,Radio Button

2.1 介绍

QRadioButton 是单选按钮,可以让我们在多个选项中选择一个,重要的属性有下面几个:

属性说明
checkable能否被选中
checked是否已经被选中(前提条件是checkable)
autoExclusive是否排它,就是选中一个按钮后取消其它按钮的选中,默认是这个

下面来演示一下:


先创建几个单选按钮出来:

假设我们要实现两个期望:①程序启动时默认选中第一个  ②禁用333选项(不可点击),可以在构造函数中更改属性:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->radioButton_1->setChecked(true); //添加一个默认选项,使程序启动时默认选一个//ui->radioButton_3->setCheckable(false); //也可以设置一个选项为禁用ui->radioButton_3->setEnabled(false); //上面的虽不可选中,但是仍会触发信号,所以用这个//ui->radioButton_3->setDisabled(true); //和上面效果一样,直接将选项搞成灰色
}

 效果如下:

2.2 另几个槽函数 

右键按钮的转到槽中,我们前面最常用的就是不带参的 clicked(),下面我们来认识下其它的:

再加一个 444 选项后,让四个选项分别选中四个槽函数,如下:

下面的槽函数展示了各具体的功能:

void Widget::on_radioButton_1_clicked(bool checked)
{//这个参数就表示了当前 rabioButton 的选中状态qDebug() << "clicked: " << checked;
}void Widget::on_radioButton_2_pressed()
{//鼠标按下还未抬起就会触发信信号qDebug() << "pressed: ";
}void Widget::on_radioButton_3_released()
{//鼠标按下时不会触发,抬起来时就会触发信号qDebug() << "released: ";
}void Widget::on_radioButton_4_toggled(bool checked)
{//表示当 checked 状态发生改变时,就会触发这个信号qDebug() << "toggled: " << checked;
}

2.3 模拟点餐

先创建一个类似的菜单页面,如下:

我们的期望是顾客可以在三条选项中,每个各选一个,但是现在是9个选项全绑在一起,也就输9个选项里都只能选一个,所以这是我们现在要解决的一个关键问题

一旦界面上存在“多组”单选按钮,我们希望组与组之间不要有影响,所以 Qt 提供了一个工具类 QButtonGroup,可以针对单选按钮进行分组,代码如下:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QButtonGroup* group1 = new QButtonGroup(this);QButtonGroup* group2 = new QButtonGroup(this);QButtonGroup* group3 = new QButtonGroup(this);//把上述单选按钮放到不同组里group1->addButton(ui->radioButton);group1->addButton(ui->radioButton_2);group1->addButton(ui->radioButton_3);group2->addButton(ui->radioButton_4);group2->addButton(ui->radioButton_5);group2->addButton(ui->radioButton_6);group3->addButton(ui->radioButton_7);group3->addButton(ui->radioButton_8);group3->addButton(ui->radioButton_9);}

 效果如下:

三,Check Button

  • 和上面的单选按钮对应,QCheckBox 表示复选按钮,可以允许选中多个,它的关键属性也是 checkable 和 checked,因为都是继承自 QAbstractButton 父类
  • 至于 QCheckBox 独有的属性 tristate 是用来实现“三态复选框” 的,但是这个东西很冷门,也用得非常少,这里不过多讨论
  • 但是对于其它的基本才做,和上述单选按钮基本一致,这里也不再赘述,直接上代码

 假设我要搞一个每日任务表,如下:

我们的期望是,当我们选择好要干的事情后,就在最上面的 Label 中排列显示我们要干的事情,按钮槽函数如下:

void Widget::on_pushButton_ok_clicked()
{QString result = "今天的安排是: ";if(ui->checkBox->isChecked()){result += ui->checkBox->text();}if(ui->checkBox_2->isChecked()){if(ui->checkBox->isChecked()) result += ",";result += ui->checkBox_2->text();}if(ui->checkBox_3->isChecked()){if(ui->checkBox->isChecked() || ui->checkBox_2->isChecked()) result += ",";result += ui->checkBox_3->text();}ui->label->setText(result);
}

效果如下:

附:如果要想 label 正确显示所有选项,在创建 label 时就要注意创建长一点或宽一点的 label ,不然就只会显示部分(我当时以为是bug,搞了几十分钟才知道是这个原因)

    四,补充

    当退出qrc文件后,再次双击 qrc 文件想切换回刚才的qrc编辑器,大概率是没有反应的,下面介绍三种办法

    方法一

    如果之前打开过 qrc 文件且目前的窗口没有关闭过,那么可以在上面的下拉菜单里打开,如下图:

    方法二

    如果下拉菜单里没有 qrc 文件,那么可以用右键 qrc 文件,选择用资源编辑器打开:

    方法三

    如果还是不行,可以直接在电脑资源管理器里打开项目目录,找到qrc,右键使用 Qt 打开:

    http://www.lryc.cn/news/586056.html

    相关文章:

  • RS232通信如何实现(硬件部分)
  • 请求服务端获取broker的机房归属信息异常
  • 端到端自动驾驶:挑战与前沿
  • Unity URP + XR 自定义 Skybox 在真机变黑问题全解析与解决方案(支持 Pico、Quest 等一体机)
  • 时序数据预处理
  • Javaweb总结一
  • AV1高层语法
  • 【Elasticsearch 】search_throttled
  • (LeetCode 面试经典 150 题 ) 209. 长度最小的子数组(双指针)
  • 【C语言】回调函数、转移表、qsort 使用与基于qsort改造冒泡排序
  • 汇编语言与操作系统交互
  • 27.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--币种服务(一)
  • Kotlin文件操作
  • 留学真相:凌晨两点被海关拦下时,我才明白人生没有退路
  • 【Java八股文总结 — 包学会】(二)计算机网络
  • 力扣 hot100 Day42
  • 精密模具大深径比微孔尺寸检测方案 —— 激光频率梳 3D 轮廓检测
  • 【STM32实践篇】:最小系统组成
  • AI软件出海SEO教程
  • Ubuntu快速搭建QT开发环境指南,5000字解析!!
  • 鸿蒙的NDK开发初级入门篇
  • 附件1.2025年世界职业院校技能大赛赛道简介
  • 分音塔科技(BABEL Technology) 的公司背景、股权构成、产品类型及技术能力的全方位解读
  • 2025 年 4-6 月大模型备案情况分析
  • Ansible 高版本 SELinux 模块深度解析:内置接口原理与实战指南
  • 迷宫可达性统计问题详解
  • 啤酒自动装箱机构设计cad【10张】+三维图+设计说明书
  • Linux操作系统之进程间通信:共享内存
  • Javaweb- 11 MVC架构模式
  • Redis渗透思路总结