QT批量实现单选按钮组
自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取:
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);
如果有多个筛选界面,可以再封装一层。
自己开发了一个股票智能分析软件,功能很强大,需要的关注微信公众号:QStockView
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix