QT批量实现单选按钮组
2023-09-14 09:07:36 时间
自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取:
https://www.cnblogs.com/bclshuai/p/11380657.html
QT批量实现单选按钮组
目录
1 应用场景... 1
2 实现方案... 1
1 应用场景
筛选条件过多时,会有多个条件筛选,选择样式是按钮形式,不是那种勾选。如下图所示,单选条件,有多选项, 每一个条件只能选择一个, 选中之后颜色加深,没选中的自动变为浅灰色。
2 实现方案
如果一个一个的在界面上去拼,会造成大量的工作量,而且如果要修改一条,则需要挪动多个按钮的位置,所以可以通过代码批量实现,自动排序位置。
每一行用一个类来封装,设置名称和选项值,点击按钮时需要保证选项的唯一性。
(1)头文件定义接口 #pragma once #include <QWidget> #include<QPushButton> struct SelectItem { int value = -1; QString name = "不限"; QPushButton* pButtton = NULL; SelectItem(int v,QString n) { value = v; name = n; pButtton = NULL; } SelectItem() { value = -1; name = "不限"; pButtton = NULL; } }; class SelectButton : public QWidget { Q_OBJECT public: SelectButton(QWidget * parent = Q_NULLPTR); ~SelectButton(); /* 输入显示的数据 strName:条件的名称 Items :条件的选项 */ void SetData(QString strName,QVector<SelectItem> Items); /* 获取选中的按钮对应的值 */ int GetValue(); /* 重置按钮 */ void Reset(); private: QVector<SelectItem> m_Items;//按钮对应的数值 int m_currentIndex=0;//选中按钮的索引值 }; (2)源文件实现接口 #include "SelectButton.hpp" #include<QLabel> SelectButton::SelectButton(QWidget * parent) { if (parent != NULL) { setParent(parent); } setFixedHeight(40); } SelectButton::~SelectButton() { for (int j = 0; j < m_Items.size(); j++) { if (m_Items[j].pButtton != NULL) { delete m_Items[j].pButtton; m_Items[j].pButtton = NULL; } } } void SelectButton::SetData(QString strName, QVector<SelectItem> Items) { m_Items = Items; QLabel* pName = new QLabel(this); pName->setText(strName); pName->setGeometry(24, 0, 100, 40); int namewidth = 100; int Itemwidth = 70; for (int i = 0; i < m_Items.size(); i++) { QPushButton* pButton = new QPushButton(this); if (pButton != NULL) { if (i==0) {//默认选择第0个 pButton->setStyleSheet(QLatin1String("QPushButton\n" "{\n" " background:rgb(79, 79, 79);\n" " border:0px;\n" "}\n" "QPushButton::hover\n" "{\n" " background:rgb(79, 79, 79);\n" "}"));//设置为未选中状态 } else { pButton->setStyleSheet(QLatin1String("QPushButton\n" "{\n" " background:rgb(177, 177, 177);\n" " border:0px;\n" "}\n" "QPushButton::hover\n" "{\n" " background:rgb(79, 79, 79);\n" "}"));//设置为未选中状态 } m_Items[i].pButtton = pButton; pButton->setGeometry(i * Itemwidth + namewidth, 0, 40, 40); pButton->setText(m_Items[i].name); connect(pButton, &QPushButton::clicked, this, [=]() { if (m_currentIndex != i)//选择变化 { pButton->setStyleSheet(QLatin1String("QPushButton\n" "{\n" " background:rgb(79, 79, 79);\n" " border:0px;\n" "}\n" "QPushButton::hover\n" "{\n" " background:rgb(79, 79, 79);\n" "}"));//设置为选中状态 if (m_currentIndex<m_Items.size()&& m_currentIndex>=0) { if (m_Items[m_currentIndex].pButtton!=NULL) { m_Items[m_currentIndex].pButtton->setStyleSheet(QLatin1String("QPushButton\n" "{\n" " background:rgb(177, 177, 177);\n" " border:0px;\n" "}\n" "QPushButton::hover\n" "{\n" " background:rgb(79, 79, 79);\n" "}"));//设置为没选中状态 } } m_currentIndex = i;//更新当前值 } for (int j = 0; j < m_Items.size(); j++) { if (i != j)//设置其他按钮为未选中状态 { } } }); } } this->setFixedWidth(m_Items.size() * Itemwidth + namewidth);//设置宽度 } int SelectButton::GetValue() { if (m_currentIndex<0 || m_currentIndex>=m_Items.size()) { return -1; } else { return m_Items[m_currentIndex].value; } return 0; } void SelectButton::Reset() { if (m_currentIndex < m_Items.size() && m_currentIndex >= 0) { if (m_Items[m_currentIndex].pButtton != NULL) { m_Items[m_currentIndex].pButtton->setStyleSheet(QLatin1String("QPushButton\n" "{\n" " background:rgb(177, 177, 177);\n" " border:0px;\n" "}\n" "QPushButton::hover\n" "{\n" " background:rgb(79, 79, 79);\n" "}"));//设置为没选中状态 } } m_currentIndex = 0; if (m_Items[m_currentIndex].pButtton != NULL) { m_Items[m_currentIndex].pButtton->setStyleSheet(QLatin1String("QPushButton\n" "{\n" " background:rgb(79, 79, 79);\n" " border:0px;\n" "}\n" "QPushButton::hover\n" "{\n" " background:rgb(79, 79, 79);\n" "}"));//设置为选中状态 } } (3)主程序中创建选择项对象 //人体属性界面 xpos = 0; ypos = 8; yindex = 0; SelectButton* pBodySex = new SelectButton(ui.pageBody); pBodySex->SetData("性别", sexItem); pBodySex->move(xpos, ypos + yindex * 50); yindex++; SelectButton* pBodyAge = new SelectButton(ui.pageBody); pBodyAge->SetData("年龄", ageStageItem); pBodyAge->move(xpos, ypos + yindex * 50); yindex++; SelectButton* pBodyGlass = new SelectButton(ui.pageBody); pBodyGlass->SetData("戴眼镜", glassItem); pBodyGlass->move(xpos, ypos + yindex * 50); yindex++; SelectButton* pBodyMask = new SelectButton(ui.pageBody); pBodyMask->SetData("戴口罩", glassItem); pBodyMask->move(xpos, ypos + yindex * 50); yindex++; SelectButton* pBodyHat = new SelectButton(ui.pageBody); pBodyHat->SetData("戴帽子", hatItem); pBodyHat->move(xpos, ypos + yindex * 50); yindex++; SelectButton* pBodyUpClotherColor = new SelectButton(ui.pageBody); pBodyUpClotherColor->SetData("上衣颜色", clotherColorItem); pBodyUpClotherColor->move(xpos, ypos + yindex * 50); yindex++; SelectButton* pBodyDownClotherColor = new SelectButton(ui.pageBody); pBodyDownClotherColor->SetData("下衣颜色", clotherColorItem); pBodyDownClotherColor->move(xpos, ypos + yindex * 50); yindex++; SelectButton* pBodyBag= new SelectButton(ui.pageBody); pBodyBag->SetData("背包", maskItem); pBodyBag->move(xpos, ypos + yindex * 50); yindex++; SelectButton* pBodyTake = new SelectButton(ui.pageBody); pBodyTake->SetData("拎东西", maskItem); pBodyTake->move(xpos, ypos + yindex * 50); yindex++; ui.pBtBodySerch->move(ui.pBtBodySerch->x(), ypos + yindex * 50); ui.pBtBodyReset->move(ui.pBtBodyReset->x(), ypos + yindex * 50);
如果有多个筛选界面,可以再封装一层。
相关文章
- Qt编写GIF录屏工具(开源)「建议收藏」
- Qt自绘系列-放大镜
- 解决Ubuntu下使用linuxdeployqt打包Qt程序问题
- Linux系统使用Qt开发快速入门教程(linux下qt教程)
- Linux串口应用开发实践——Qt篇(linux串口qt)
- 版本Qt终于发布了Linux版本(qt发布linux)
- 安装Linux系统,学习QT开发技术(linux安装qt教程)
- Linux虚拟机中安装Qt的指南(linux虚拟机安装qt)
- Linux下高效安装Qt(linux下安装qt)
- Linux下Qt实现串口通信(linux下qt串口)
- Linux编译Qt:一步一步教程(linux编译qt)
- 简明易懂的Linux下QT安装指南(linux下安装qt教程)
- Qt编程实现MySQL数据库调用(qt调用MySQL数据库)
- QT快速加载MySQL驱动的简单操作(qt加载mysql驱动)
- 配置Linux的QT环境变量,轻松打造高效开发环境(qt环境变量linux)
- 使用Qt实现MySQL数据库连接教程(qt连接mysql数据库)
- 使用Qt框架插入MySQL中的数据(qt插入mysql)
- Linux QT支持中文交互体验(linux qt 中文)
- QT如何访问MySQL数据库(qt访问mysql数据库)
- 如何在Linux上运行QT程序?(linux运行qt程序)
- 轻松实现QT直连Microsoft SQL Server(qt直连mssql)
- MySQL和QT不配套使用,无法实现事务处理(mysql不支持qt事务)