博客
关于我
2-4-QCheckBox(单选框)、QRadioButton(复选框)
阅读量:799 次
发布时间:2023-04-15

本文共 5694 字,大约阅读时间需要 18 分钟。

QCheckBox 和 QRadioButton 的使用与实现

以下是基于 Qt 的 C++ 项目中,QCheckBox 和 QRadioButton 组件的实现步骤和代码示例

1. QCheckBox 的实现

QCheckBox 是一个常用的组件,用于在窗口中创建可选的复选框。以下是实现 QCheckBox 的代码示例

#include "widget.h"
#include "ui_widget.h"
// 头文件包含
#include
#include
#include
#include
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget* parent = nullptr);
~Widget();
private:
Ui::Widget* ui;
private slots:
void doProcess();
void doProcessCheckBox();
void doProcessRadioButton();
};
#include "widget.h"
#include "ui_widget.h"
#include
#include
#include
#include
Widget::Widget(QWidget* parent) : QWidget(parent)
{
ui = new Ui::Widget;
ui->setupUi(this);
// 设置图标
ui->toolButton->setIcon(QIcon("../timg.jpg"));
ui->toolButton->setIconSize(QSize(120, 120));
// 创建菜单
QMenu* menu = new QMenu(this);
menu->addAction(QIcon("../timg2.jpg"), "树0", this, SLOT(doProcess()));
menu->addAction(QIcon("../timg3.jpg"), "树1", this, "");
menu->addAction(QIcon("../timg2.jpg"), "树2", this, "");
menu->addAction(QIcon("../timg2.jpg"), "树3", this, "");
menu->addAction(QIcon("../timg2.jpg"), "树4", this, "");
menu->addAction(QIcon("../timg2.jpg"), "树5", this, "");
menu->addAction(QIcon("../timg2.jpg"), "树6", this, "");
ui->toolButton->setMenu(menu);
// 绑定信号与槽
connect(ui->checkBox1, SIGNAL(clicked(bool)), this, SLOT(doProcessCheckBox()));
connect(ui->checkBox2, SIGNAL(clicked(bool)), this, SLOT(doProcessCheckBox()));
connect(ui->checkBox3, SIGNAL(clicked(bool)), this, SLOT(doProcessCheckBox()));
connect(ui->radioButton1, SIGNAL(clicked(bool)), this, SLOT(doProcessRadioButton()));
connect(ui->radioButton2, SIGNAL(clicked(bool)), this, SLOT(doProcessRadioButton()));
}

2. QRadioButton 的实现

QRadioButton 是用于创建单选按钮的组件,常见于选项卡或选项组中。以下是 QRadioButton 的实现代码

void Widget::doProcessRadioButton()
{
qRadiobutton* rbtn = (QRadioButton*) sender();
if (rbtn->isChecked())
{
qDebug() << "当前选中单选项:" << rbtn->text();
}
}

3. 组件的事件处理

当用户点击复选框或单选按钮时,会触发相应的信号。以下是处理这些信号的函数

void Widget::doProcessCheckBox()
{
qCheckBox* cbox = (QCheckBox*) sender();
if (cbox->isChecked())
{
qDebug() << "当前选中复选项:" << cbox->text();
}
}

4. 项目的总体结构

整个项目的主要代码文件包含以下部分:

widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
#include
#include
#include
#include
namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget* parent = nullptr); ~Widget(); private: Ui::Widget* ui; private slots: void doProcess(); void doProcessCheckBox(); void doProcessRadioButton(); }; #endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include
#include
#include
#include
#include
Widget::Widget(QWidget* parent) : QWidget(parent)
{
ui = new Ui::Widget;
ui->setupUi(this);
// 设置图标
ui->toolButton->setIcon(QIcon("../timg.jpg"));
ui->toolButton->setIconSize(QSize(120, 120));
// 创建菜单
QMenu* menu = new QMenu(this);
menu->addAction(QIcon("../timg2.jpg"), "树0", this, SLOT(doProcess()));
menu->addAction(QIcon("../timg3.jpg"), "树1", this, "");
menu->addAction(QIcon("../timg2.jpg"), "树2", this, "");
menu->addAction(QIcon("../timg2.jpg"), "树3", this, "");
menu->addAction(QIcon("../timg2.jpg"), "树4", this, "");
menu->addAction(QIcon("../timg2.jpg"), "树5", this, "");
menu->addAction(QIcon("../timg2.jpg"), "树6", this, "");
ui->toolButton->setMenu(menu);
// 绑定信号与槽
connect(ui->checkBox1, SIGNAL(clicked(bool)), this, SLOT(doProcessCheckBox()));
connect(ui->checkBox2, SIGNAL(clicked(bool)), this, SLOT(doProcessCheckBox()));
connect(ui->checkBox3, SIGNAL(clicked(bool)), this, SLOT(doProcessCheckBox()));
connect(ui->radioButton1, SIGNAL(clicked(bool)), this, SLOT(doProcessRadioButton()));
connect(ui->radioButton2, SIGNAL(clicked(bool)), this, SLOT(doProcessRadioButton()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::doProcess()
{
qDebug() << "222";
qDebug() << "当前选中树项:" << ui->toolButton->menu()->currentItem()->text();
}
void Widget::doProcessCheckBox()
{
qCheckBox* cbox = (QCheckBox*)sender();
if (cbox->isChecked())
{
qDebug() << "当前选中复选项:" << cbox->text();
}
}
void Widget::doProcessRadioButton()
{
qRadioButton* rbtn = (QRadioButton*)sender();
if (rbtn->isChecked())
{
qDebug() << "当前选中单选项:" << rbtn->text();
}
}

5. 代码的核心要点

  • 信号与槽的绑定:在 Widget::Widget 的构造函数中,通过 connect 函数将 UI 组件的信号与应用程序的槽绑定。例如,复选框的 clicked 信号绑定 doProcessCheckBox 函数,单选按钮的 clicked 信号绑定 doProcessRadioButton 函数。

  • 菜单的创建与设置:通过 QMenu 类创建菜单,并通过 addAction 方法添加菜单项。每个菜单项可以带有图标和文本,点击菜单项时会触发指定的函数(如 doProcess())。

  • 事件处理函数doProcess()doProcessCheckBox()doProcessRadioButton() 是事件处理函数,用于根据用户的操作打印相关信息。例如,doProcessCheckBox() 会打印当前选中的复选项文本。

  • 图标的设置ui->toolButton->setIcon(...)ui->toolButton->setIconSize(...) 用于为工具按钮设置图标和图标大小。

6. 项目的实际应用

在实际应用中,可以通过上述代码创建一个带有复选框和单选按钮的窗口。用户可以通过点击这些组件来触发相应的事件处理函数,从而实现特定的功能。例如,可以根据用户的选择进行数据处理、状态切换等操作。

7. 常见问题与解决方法

  • Menu 项的信号处理:如果菜单项的信号没有绑定到合适的槽函数,可以通过 connect 函数手动绑定。例如,可以将菜单的 triggered() 信号绑定到 doProcess()

  • 信号传递的正确性:在事件处理函数中,使用 sender() 方法获取信号来源组件,确保正确的组件被传递。例如,在 doProcessCheckBox() 中,qCheckBox* cbox = (QCheckBox*)sender(); 确保 cbox 是发送信号的复选框组件。

  • UI 组件的布局:在 ui->setupUi(this); 之后,可以通过 ui->horizontalLayout->addWidget(...); 等方法布局 UI 组件,确保组件在窗口中正确显示。

通过以上代码示例和优化,可以更好地理解并使用 Qt 的组件来开发高效的 GUI 应用程序

转载地址:http://derfk.baihongyu.com/

你可能感兴趣的文章
mysql - 视图
查看>>
MySQL - 解读MySQL事务与锁机制
查看>>
MTTR、MTBF、MTTF的大白话理解
查看>>
mt_rand
查看>>
mysql -存储过程
查看>>
mysql /*! 50100 ... */ 条件编译
查看>>
mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
查看>>
mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
查看>>
mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
查看>>
mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
查看>>
MySQL 8.0 恢复孤立文件每表ibd文件
查看>>
MySQL 8.0开始Group by不再排序
查看>>
mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
查看>>
multi swiper bug solution
查看>>
MySQL Binlog 日志监听与 Spring 集成实战
查看>>
MySQL binlog三种模式
查看>>
multi-angle cosine and sines
查看>>
Mysql Can't connect to MySQL server
查看>>
mysql case when 乱码_Mysql CASE WHEN 用法
查看>>
Multicast1
查看>>