【QT开发笔记-基础篇】

2023-10-27

本节对应的视频讲解:B_站_视_频

https://www.bilibili.com/video/BV11G411x7hN


Qt 中的单选按钮类是 QRadioButton

它是一个可以切换选中(checked)或未选中(unchecked)状态的单选按钮

单选按钮常用在 “多选一” 的场景,也就是说,在一组单选按钮中,一次只能选中一个单选按钮

比如性别中的 “男女” 二选一,学历中的 “博士/硕士/本科/其他” 四选一,等等。
单选按钮-案例


1. 属性和方法


QRadioButton 有很多属性,完整的可查看帮助文档。这里列出常用的属性和方法:


1.1 文本

这两个是其父类 QAbstractButton 中的属性和方法,因此 QPushButtonQRadioButtonQCheckBox 都具有该属性

// 获取和设置显示的文本
QString text() const
void setText(const QString &text)

1.2 选中状态

// 获取和设置单选按钮的选中状态
bool isChecked() const
void setChecked(bool)

可见,切换单选按钮的选中状态,有两种方式:

  • 通过鼠标点击实现
  • 在代码中使用 setChecked(bool) 来实现

1.3 自动排他

我们前面说过,单选按钮实现的是 “多选一”,因此单选按钮的该属性默认是使能的

// 获取和设置自动排他
bool autoExclusive() const
void setAutoExclusive(bool)

而对于多选按钮,也叫复选按钮-QCheckBox,通常的场景是用户选择一组按钮中的多个,因此该属性默认是禁能的。

综合以上,“多选一” 要满足以下两个条件:

  • 把同一组的单选按钮,放在同一个布局中。不同的组的单选按钮,放在不同的布局中

  • 单选按钮的 autoExclusive 属性设置为 true,单选按钮的该属性默认是使能的。可在右侧的属性按钮中看到,如下:
    自动排他


1.4 信号槽

按钮在按下和抬起的过程中,会发射多个信号。

// 单选按钮 QRadioButton 被点击时,会发出该信号
void clicked();

// 当单选按钮的选中状态发生改变时,会发射该信号
// 所谓状态改变,是指选中变为非选中,和非选中变为选中
void toggled(bool checked)

2. 案例


该案例演示,单选按钮的属性以及信号槽
案例


2.1 布局

UI 设计师界面,拖拽对应的控件,修改显示的文字、控件的 name,然后完成布局


2.2 代码实现

完整的项目,在本节视频的置顶评论下载即可

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 设置第2组中的默认显示
    ui->rbMale2->setChecked(true);
    ui->rbMaster2->setChecked(true);

    // 设置第3组中的默认显示
    ui->rbFemale3->setChecked(true);
    ui->rbDoctor3->setChecked(true);

    // 使用 QButtonGroup 对单选按钮进行分组
    mBtnGroupGender = new QButtonGroup(this);
    mBtnGroupGender->addButton(ui->rbMale4,0);
    mBtnGroupGender->addButton(ui->rbFemale4,1);

    mBtnGroupEdu = new QButtonGroup(this);
    mBtnGroupEdu->addButton(ui->rbDoctor4,10);
    mBtnGroupEdu->addButton(ui->rbMaster4,11);
    mBtnGroupEdu->addButton(ui->rbBachelor4,12);
    mBtnGroupEdu->addButton(ui->rbOther4,13);

    connect(ui->rbMale4, &QRadioButton::clicked, this, &Widget::onRadioButtonClicked);
    connect(ui->rbFemale4, &QRadioButton::clicked, this, &Widget::onRadioButtonClicked);
    connect(ui->rbDoctor4, &QRadioButton::clicked, this, &Widget::onRadioButtonClicked);
    connect(ui->rbMaster4, &QRadioButton::clicked, this, &Widget::onRadioButtonClicked);
    connect(ui->rbBachelor4, &QRadioButton::clicked, this, &Widget::onRadioButtonClicked);
    connect(ui->rbOther4, &QRadioButton::clicked, this, &Widget::onRadioButtonClicked);

    // 设置第4组中的默认显示
    ui->rbMale4->setChecked(true);
    ui->rbBachelor4->setChecked(true);
    onRadioButtonClicked();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_btnGetSelection_clicked()
{
    QString s;

    if(ui->rbMale3->isChecked()) {
        s += ui->rbMale3->text();
    } else if(ui->rbFemale3->isChecked()) {
        s += ui->rbFemale3->text();
    }

    if(ui->rbDoctor3->isChecked()) {
        s += ui->rbDoctor3->text();
    } else if(ui->rbMaster3->isChecked()) {
        s += ui->rbMaster3->text();
    } else if(ui->rbBachelor3->isChecked()) {
        s += ui->rbBachelor3->text();
    } else if(ui->rbOther3->isChecked()) {
        s += ui->rbOther3->text();
    }

    ui->leResult3->setText(s);
}

void Widget::onRadioButtonClicked()
{
    QString s;

    int checkedGenderId = mBtnGroupGender->checkedId();
    if(checkedGenderId == 0) {
        s += "男";
    } else if(checkedGenderId == 1) {
        s += "女";
    }

    int checkedEduId = mBtnGroupEdu->checkedId();
    if(checkedEduId == 10) {
        s += "博士";
    } else if(checkedEduId == 11) {
        s += "硕士";
    } else if(checkedEduId == 12) {
        s += "本科";
    } else if(checkedEduId == 13) {
        s += "其他";
    }

    ui->leResult4->setText(s);
}

void Widget::on_rbMale4_toggled(bool checked)
{
    qDebug()<< "rbMale4 state changed: " << checked;
}

本节对应的视频讲解:B_站_视_频

https://www.bilibili.com/video/BV11G411x7hN

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【QT开发笔记-基础篇】 的相关文章

  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • Qt 模型/视图与标准小部件

    我目前正在阅读模型 视图tutorial http qt project org doc qt 4 8 modelview html来自 Qt 但我仍然不确定是否应该为我的 Qt 程序使用模型 视图或小部件 我需要做一个记录器应用程序来监视
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • Linux 堆栈大小

    我正在寻找 Linux 内核中堆栈的良好描述 但我发现找到任何有用的东西出奇地困难 我知道大多数系统的堆栈限制为 4k 而其他系统则限制为 8k 我假设每个内核线程 下半部分都有自己的堆栈 我还听说 如果中断发生 它会使用当前线程的堆栈 但
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub

随机推荐