Qt开发 按钮类控件

Qt开发 按钮类控件

Push Button

使用 QPushButton 表示一个按钮。

QPushButton 继承自 QAbstractButton 。这个类是一个抽象类,是其他按钮的父类。

在这里插入图片描述

在 Qt Designer 中也能够看到这里的继承关系

在这里插入图片描述

QAbstractButton 中,和 QPushButton 相关性较大的属性

属性说明
text按钮中的文本
icon按钮中的图标
iconSize按钮中图标的尺寸
shortCut按钮对应的快捷键
autoRepeat按钮是否会重复触发当鼠标左键按住不放时,
如果设为 true,则会持续产生鼠标点击事件
如果设为 false,则必须释放鼠标再次按下鼠标时才能产生点击事件
(相当于游戏手柄上的"连发”效果)<br /
autoRepeatDelay重复触发的延时时间。按住按钮多久之后,开始重复触发.
autoRepeatInterval重复触发的周期
  • QAbstractButton 作为 Qwidget 的子类,当然也继承了 QWidget 的属性。上面介绍的 QWidget 里的各种属性用法,对于 QAbstractButton 同样适用。因此表格仅列出 QAbstractButton 独有的属性。
  • Qt 的 api 设计风格是非常清晰的。此处列出的属性都是可以获取和设置的。例如使用 text(),获取按钮文本;使用 setText() 设置文本。

事实上,QPushButton 的核心功能都是 QAbstractButton 提供的,自身提供的属性都比较简单。

其中 defaultautoDefault 影响的是按下 enter 时自动点击哪个按钮的行为: flat 把按钮设置为扁平的样式,这里我们暂时都不做过多关注

代码示例:带有图标的按钮

(1) 创建 resource.qrc 文件,并导入图片

在这里插入图片描述

(2) 在界面上创建⼀个按钮

在这里插入图片描述

(3) 修改 widget.cpp,给按钮设置图标

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

(4) 执行程序, 观察效果

在这里插入图片描述

代码示例:带有快捷键的按钮

(1) 在界面中拖五个按钮

五个按钮的 objectName 分别为 pushButton_targetpushButton_uppushButton_downpushButton_left , pushButton_right

五个按钮的初始位置随意,其中 pushButton_target 尺寸设置为100 100,其余按钮设为50 50,文本内容均清空。

在这里插入图片描述

(2) 创建 resource.qrc,并导入 5 个图片

在这里插入图片描述

(3) 修改 widget.cpp,设置图标资源和快捷键

  • 使用 setshortcut 给按钮设置快捷键。参数是一个 QKeySequence 对象。表示一个按键序列。支持组合键(ctrl + c这种).
  • QKeySequence 的构造函数参数,可以直接使用“ctrl+c"这样的按键名字符串表示,也可以使用预定义好的常量(形如 Qt::CTRL + Qt::Key_C )表示
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{ui->setupUi(this);// 设置图标ui->pushButton_target->setIcon(QIcon(":/dog.png"));ui->pushButton_target->setIconSize(QSize(100, 100));ui->pushButton_up->setIcon(QIcon(":/caret-up.png"));ui->pushButton_down->setIcon(QIcon(":/caret-down.png"));ui->pushButton_left->setIcon(QIcon(":/caret-left.png"));ui->pushButton_right->setIcon(QIcon(":/caret-right.png"));// 设置快捷键ui->pushButton_up->setShortcut(QKeySequence("w"));ui->pushButton_down->setShortcut(QKeySequence("s"));ui->pushButton_left->setShortcut(QKeySequence("a"));ui->pushButton_right->setShortcut(QKeySequence("d"));// 设置快捷键也可以写作// ui->pushButton_up->setShortcut(QKeySequence(Qt::Key_W));// ui->pushButton_down->setShortcut(QKeySequence(Qt::Key_S));// ui->pushButton_left->setShortcut(QKeySequence(Qt::Key_A));// ui->pushButton_right->setShortcut(QKeySequence(Qt::Key_D));
}

(4) 修改 widget.cpp,设置四个方向键的 slot 函数

void Widget::on_pushButton_up_clicked()
{const QRect& rect = ui->pushButton_target->geometry();ui->pushButton_target->setGeometry(rect.x(), rect.y() -5, rect.width(),
rect.height());qDebug() << "up";
}void Widget::on_pushButton_down_clicked()
{const QRect& rect = ui->pushButton_target->geometry();ui->pushButton_target->setGeometry(rect.x(), rect.y() + 5, rect.width(),
rect.height());qDebug() << "down";
}void Widget::on_pushButton_left_clicked()
{const QRect& rect = ui->pushButton_target->geometry();ui->pushButton_target->setGeometry(rect.x() - 5, rect.y(), rect.width(),
rect.height());qDebug() << "left";
}
void Widget::on_pushButton_right_clicked()
{const QRect& rect = ui->pushButton_target->geometry();ui->pushButton_target->setGeometry(rect.x() + 5, rect.y(), rect.width(),
rect.height());qDebug() << "right";
}

(5) 运行程序,此时点击按钮,或者使用 wasd 均可让狗头移动

在这里插入图片描述

代码示例:按钮的重复触发

在上述案例中,按住快捷键,是可以进行重复触发的但是鼠标点击则不能

修改 widget.cpp,在构造函数中开启重复触发

// 开启重复触发
ui->pushButton_up->setAutoRepeat(true);
ui->pushButton_down->setAutoRepeat(true);
ui->pushButton_left->setAutoRepeat(true);
ui->pushButton_right->setAutoRepeat(true);

此时,按住鼠标时,即可让狗头连续移动

Radio Buttion

QRadioButton 是单选按钮可以让我们在多个选项中选择一个

作为 QAbstractButtonQWidget 的子类,上面介绍的属性和用法,对于 QRadioButton 同样适用.

QAbstractButton 中和 QRadioButton 关系较大的属性

属性说明
checkable是否能选中
checked是否已经被选中. checkable 是 checked 的前提条件.
autoExclusive是否排他.
选中⼀个按钮之后是否会取消其他按钮的选中.
对于 QRadioButton 来说默认就是排他的.

代码示例:选择性别

(1) 在界面上创建一个 label,和 3 个单选按钮

设置的文本如下图。3 个单选按钮的 objectName 分别为 radioButton_maleradioButton_female , radioButton_other

在这里插入图片描述

(2) 修改 widget.cpp,编辑三个 QRadioButton 的 slot 函数.

void Widget::on_radioButton_male_clicked()
{ui->label->setText("你选择的性别为: 男");
}void Widget::on_radioButton_female_clicked()
{ui->label->setText("你选择的性别为: ⼥");
}void Widget::on_radioButton_other_clicked()
{ui->label->setText("你选择的性别为: 其他");
}

(3) 运行程序,可以看到随着选择不同的单选按钮,label 中的提示文字就会随之变化

在这里插入图片描述

(4) 当前代码中,如果程序启动,则不会选择任何选项

可以修改代码,让程序启动默认选中性别男

Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{ui->setupUi(this);// 设置默认选中该按钮ui->radioButton_male->setChecked(true);ui->label->setText("你选择的性别为: 男");
}

此时运行程序,即可看到性别男,已经被选中了

(5) 当前代码中也可以禁用“其他”被选中

修改 widget.cpp 的构造函数

// 禁⽤ other 选项
ui->radioButton_other->setCheckable(false);

运行程序,可以看到,点击“其他"按钮的时候,虽然不会被选中,但是可以触发点击事件,使上面的label
显示性别为其他.

在这里插入图片描述

使用 setEnabled 是更彻底的禁用按钮的方式,此时该按钮无法被选中也无法响应任何输入

// 禁⽤ other 选项
ui->radioButton_other->setEnabled(false);

在这里插入图片描述

代码示例:click, press, release, toggled 的区别

  • clicked 表示一次“点击!
  • pressed 表示鼠标"按下
  • released 表示鼠标"释放"
  • toggled 表示按钮状态切换

(1) 在界面上创建四个单选按钮

objectName 分别为 radioButtonradioButton_2radioButton_3radioButton_4

在这里插入图片描述

(2) 给 1创建 clicked 槽函数,给 2 创建 pressed 槽函数,给 3 创建 released 槽函数,给 4 创建 toggled 槽函数。

void Widget::on_radioButton_clicked()
{qDebug() << "clicked";
}void Widget::on_radioButton_2_pressed()
{qDebug() << "pressed";
}void Widget::on_radioButton_3_released()
{qDebug() << "released";
}void Widget::on_radioButton_4_toggled(bool checked)
{if (checked) {qDebug() << "toggled checked true";} else {qDebug() << "toggled checked false";}
}

(3) 运行程序, 可以看到

  • clicked 是一次鼠标按下+鼠标释放触发的
  • pressed 是鼠标按下触发的
  • released 是鼠标释放触发的
  • toggled 是 checked 属性改变时触发的

总的来说,toggled 是最适合 QRadioButton 的。

代码示例:单选框分组

(1) 在界面上创建 6 个单选框, 用来模拟麦当劳点餐界面

objectName 分别为 radioButtonradioButton_6

在这里插入图片描述

此时直接运行程序,可以看到,这六个 RadioButton 之间都是排他的.

我们希望每一组内部来控制排他,但是组和组之间不能排他。

(2) 引入 QButtonGroup 进行分组.

修改 widget.cpp

Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{ui->setupUi(this);// 创建三个 QButtonGroupQButtonGroup* group1 = new QButtonGroup(this);QButtonGroup* group2 = new QButtonGroup(this);QButtonGroup* group3 = new QButtonGroup(this);// 把 QRadioButton 两两⼀组, 放到三个 QButtonGroup 中.group1->addButton(ui->radioButton);group1->addButton(ui->radioButton_2);group2->addButton(ui->radioButton_3);group2->addButton(ui->radioButton_4);group3->addButton(ui->radioButton_5);group3->addButton(ui->radioButton_6);
}

再次执行程序,可以看到可以按照正确的分组方式来完成排他了

在这里插入图片描述

Check Box

QCheckBox 表示复选按钮,可以允许选中多个。

QCheckBox 最相关的属性也是 checkablechecked ,都是继承自 QAbstractButton

至于 QCheckBox 独有的属性 tristate 用来实现 “三态复选框” . 这个东西比较冷门

代码示例:获取复选按钮的取值

(1) 在界面上创建三个复选按钮,和一个普通按钮

objectName 分别为 checkBox_eatcheckBox_sleepcheckBox_play,以及 pushButton

在这里插入图片描述

(2) 给 pushbutton 添加 slot 函数

void Widget::on_pushButton_clicked()
{QString result;if (ui->checkBox_eat->isChecked()) {result += ui->checkBox_eat->text();}if (ui->checkBox_sleep->isChecked()) {result += ui->checkBox_sleep->text();}if (ui->checkBox_play->isChecked()) {result += ui->checkBox_play->text();}qDebug() << "选中的内容: " << result;
}

(3) 运行程序, 可以看到点击确认按钮时, 就会在控制台中输出选中的内容

在这里插入图片描述

Tool Button

QToolButton 的大部分功能,和 QPushButton 是一致的,但是 QToolButton 主要应用在工具栏,菜单等场景。这个暂时先不介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/505868.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cetos7 Docker 安装 gitlab

一、gitlab 简单介绍和安装要求 官方文档&#xff1a;https://docs.gitlab.cn/jh/install/docker.html 1.1、gitlab 介绍 gitLab 是一个用于代码仓库管理系统的开源项目&#xff0c;使用git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务平台&#xff0c;通过该平…

从0开始预训练1.4b中文大模型实践

作者&#xff1a;Lil2J知乎&#xff08;已授权&#xff09; 链接&#xff1a;https://zhuanlan.zhihu.com/p/684946331 简介 这篇文章主要记录了我个人对1.4b中文大模型的实践复现过程。我选择了QWEN作为基座模型&#xff0c;并训练了一个参数量达到1.4b的预训练模型&#xff0…

C# Socket通信从入门到精通(21)——TCP发送文件与接收文件 C#代码实现

1、前言 我们在开发上位机软件的过程中经常需要发送文件,本文就是介绍如何利用tcp客户端发送文件、tcp服务器端接收文件,也就是所谓的文件传输,而且本文介绍的方法具备以下特点: 1)可配置发送的文件夹和接收的文件夹路径: 2)可自动发送指定文件夹下的所有子目录和文件;…

备战蓝桥杯---动态规划之悬线法

Em...属于一知道就会&#xff0c;不知道的话比较难想。 我们先看题&#xff1a; 我们不妨把1抽象成一个平面上的点&#xff0c;因此可以变成这一幅图&#xff1a; 我们假设每一个点被向上牵拉了一根线&#xff1a; 显然&#xff0c;每一条悬线都有可能成为边界限制&#xff0c…

青少年CTF擂台挑战赛 2024 #Round 1 Web方向题解 WP 全

EasyMD5 题目描述&#xff1a;php没有难题 考点总结&#xff1a;脑洞题目&#xff0c;不如我出&#xff08;狗头 只允许两个都上传pdf文件。 文件还不能太大了。burp多次发包发现要求两个pdf内容不一样 不一样时候&#xff0c;提示我们MD5碰撞。 科学计数法绕过 PHP的后门 …

Jenkins的安装和helloworld Pipeline

文章目录 环境安装下载安装启动初始化 PipelineUISCM&#xff08;Source Control Management&#xff09;准备pipeline 参考 环境 RHEL 9.3Jenkins 2.44.0.1 安装 参考 https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos 。 下载安装 [ding192 ~]$ sudo …

Linux:kubernetes(k8s)搭建mater节点(kubeadm,kubectl,kubelet)(2)

安装k8有多种方式如&#xff1a; minikube kubeadm 二进制安装 命令行工具 我这里就使用kubeadm进行安装 环境 3台centos7 master ip &#xff1a;192.168.113.120 2G运存 2内核 node1 ip &#xff1a;192.168.113.121 2G运存 2内核 node2 ip &#xff1a;192.168.1…

ctf_show笔记篇(web入门---爆破)

爆破 21&#xff1a;直接bp抓包跑字典&#xff0c;需base64加密 22&#xff1a;可用工具跑也可用浏览器找还可以用网上做好的域名查找去找 23&#xff1a;此题需跑脚本已经附上自写脚本 最后跑出来六个答案一个一个尝试得到答案为3j import hashlibm "0123456789qwert…

适配器模式在微服务的巧妙应用

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许不兼容的接口之间可以一起工作。适配器模式通常用于将一个类的接口转换成客户端期望的另一种接口&#xff0c;从而使原本因接口不兼容而不能一起工作的类可以一起工作。 适配器模式的…

Hololens 2应用开发系列(2)——MRTK基础知识及配置文件配置(上)

Hololens 2应用开发系列&#xff08;2&#xff09;——MRTK基础知识及配置文件配置 一、前言二、MRTK基础知识2.1 MRTK概述2.2 MRTK运行逻辑2.3 MRTK配置文件介绍2.4 MRTK服务 三、配置文件使用3.1 总配置文件3.2 相机配置3.3 其他配置 参考文献 一、前言 在前面的文章中&…

【python】1.python3.12.2和pycharm社区版的安装指南

欢迎来CILMY23的博客喔&#xff0c;本篇为【python】1.python3.12.2和pycharm社区版的安装指南&#xff0c;感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 目录 一、python3.12.2的下载与安装 1.1下载 1.2安装 二、pycharm的安装 2.1下载安装 2…

【C语言】文件及文件操作详解(fseek,ftell,rwind)

目录 1. 为什么使用文件 2. 什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3. 二进制文件和文本文件 4. 文件的打开和关闭 4.1 流和标准流 4.1.1 流 4.1.2 标准流 4.2 文件指针 4.3 文件的打开和关闭 5. 文件的顺序读写 6.文件的随机读写 6.1 fseek 6.2 ft…