使用QToolButton结合QGroupButton实现自定义按钮组排列

标签: QT  QT界面  QPushButton  QButtonGroup  QT按钮

简介

将QToolButton添加入QGroupButton,使用自定义的行列间距实现按钮的组合排列。


原理

通过自定义间距结合按钮组的使用,实现按钮封装排列。

QToolButton可以显示图片和文字,并可以通过设置文字位于图片底部,实现代码:

button->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);

QGroupButton类似一个容器,可以添加按钮存储数据

buttongroup->addButton(button,index);

源码

cbasebuttongroup.h

#ifndef CBASEBUTTONGROUP_H
#define CBASEBUTTONGROUP_H

#include <QButtonGroup>
#include<QToolButton>
class CBaseButtonGroup : public QButtonGroup
{
    Q_OBJECT
public:
    CBaseButtonGroup(QWidget *widget,QObject *parent = 0);
    int AddButton(const QStringList ButtonTextList);//添加按钮
    void SetPar(int PosX,int PosY,int ColumnNum,int ColumnWidth,int RowWidth,int Width_Button,int High_Button);//设置参数
    void SetSty(QString Sty);//设置样式
    int m_PosX;//起始位置X
    int m_PosY;//起始位置Y
    int m_ColumnNum;//一行按钮个数
    int m_ColumnWidth;//行距
    int m_RowWidth;//列距
    int m_Width_Button;//按钮宽度
    int m_High_Button;//按钮高度
    int m_RowWidthBegin;//起始的列距
    QButtonGroup *group;//按钮组
    QWidget * ParentWidget;//父窗口
    QString ButtonSty;//按钮样式
protected:

    QToolButton*button;//基类按钮

signals:

public slots:

};

#endif // CBASEBUTTONGROUP_H

cbasebuttongroup.cpp

#include "cbasebuttongroup.h"

CBaseButtonGroup::CBaseButtonGroup(QWidget *widget,QObject *parent) :
    QButtonGroup(parent)
{
   this->ParentWidget = widget;
   m_PosX = 0;
   m_PosY = 0;
   m_ColumnNum = 0;
   m_ColumnWidth = 0;
   m_RowWidth = 0;
   m_Width_Button = 0;
   m_High_Button = 0;
   m_RowWidthBegin = 0;
   group = new QButtonGroup();
   //group->setExclusive(true);//设置按钮组互斥
}


int CBaseButtonGroup::AddButton(const QStringList ButtonTextList)
{
    for(int i = 0; i < ButtonTextList.count();i++)
    {
       if(i%m_ColumnNum == 0)
       {
          m_RowWidthBegin = 0;
          m_PosY+=(m_ColumnWidth+m_High_Button);
       }
       button = new QToolButton(this->ParentWidget);
       button->setGeometry(m_PosX+m_RowWidthBegin,m_PosY-(m_ColumnWidth+m_High_Button),m_Width_Button,m_High_Button);
       button->setText(ButtonTextList.value(i));
       //button->setStyleSheet(ButtonSty);
       button->setCheckable(true);
       group->addButton(button,i+1);
       m_RowWidthBegin+=(m_RowWidth+m_Width_Button);
    }
    return 0;
}

void CBaseButtonGroup::SetPar(int PosX, int PosY, int ColumnNum, int RowWidth, int ColumnWidth, int Width_Button, int High_Button)
{
    this->m_PosX = PosX;
    this->m_PosY = PosY;
    this->m_ColumnNum =ColumnNum;
    this->m_ColumnWidth = ColumnWidth;
    this->m_RowWidth = RowWidth;
    this->m_Width_Button = Width_Button;
    this->m_High_Button = High_Button;
}

void CBaseButtonGroup::SetSty(QString Sty)
{
    this->ButtonSty = Sty;
}

示例

下面我们来实现下

ButtonGroup = new CBaseButtonGroup(parent);
ButtonGroup->SetPar(120,20,2,12,20,192,70);//设置按钮的参数-->起始位置x=120,y=20,一行2个按钮,行距12,列距20,按钮宽192,高70
ButtonGroup->SetSty("QPushButton:checked {background-color:#e5143d;border-radius:4px;font-size:30px; font:bold; color:#ffffff;}" "QPushButton{background-color:#53062a;border-radius:4px;font-size:30px; font:bold; color:#ffffff;}");//设置样式,关于样式的设置网上很多这边不多说哈
QStringList str;//传参数,设置按钮的名称,也可以传图片,甚至是一个容器链表结构体QList<struct>哦,看你怎么使用哈
str << "1张" << "2张" << "3张" << "4张" << "5张" << "6张";//会根据你链表中的个数,new出对应个数的按钮
ButtonGroup->AddButton(str);

效果

最后实现一个简单的槽函数,可以实现点击对应的按钮,触发对应事件

connect(groupbutton,SIGNAL(buttonClicked(QAbstractButton*)),this,SLOT(buttonJudge(QAbstractButton*)));
void CBaseButtonGroup::buttonJudge(QAbstractButton *index)
{
    qdebug() << index.text;
}

结论

这是我写的第一篇博客,在公司实习上班的时候无聊写的哈哈。有不足的欢迎地方大家讨论交流,有问题留言必答哦

版权声明:本文为snake_man原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/snake_man/article/details/80249892

智能推荐

css3画圆和椭圆

试一下就知道怎么用了,  画个多来A梦 是用多简单...

raw&assets&sdcard读取mp3文件的方式

Raw方式 assets SDcard 首先需要添加 静态请求权限 动态请求 playMnt的播放方法 如何在模拟器中添加音乐 详细代码参见 点击跳转...

微信小程序封装请求方法wx.request(OBJECT)

小程序写完也一段时间了,最近分享下装逼的技能吧,封装请求方法,不但高大上,而且使用简单。先说说小程序自带的请求吧! wx.request(OBJECT) 参数: 参数名 类型 必填 默认值 说明 url String 是 开发者服务器接口地址 data Object/String/ArrayBuffer 否 请求的参数 header Object 否 设置请求的 header,header 中不能...

【并行计算-CUDA开发】【视频开发】ffmpeg Nvidia硬件加速总结

2017年5月25日 0. 概述 FFmpeg可通过Nvidia的GPU进行加速,其中高层接口是通过Video Codec SDK来实现GPU资源的调用。Video Codec SDK包含完整的的高性能工具、源码及文档,支持,可以运行在Windows和Linux系统之上。从软件上来说,SDK包含两类硬件加速接口,用于编码加速的NVENCODE API和用于解码加速的NVDECODE API(之前被...

猜你喜欢

HTML简介及部分常用标签

一、HTML简介 1)HTML简介 HTML是⽤于创建⽹⻚的语⾔。我们通过使⽤HTML标记标签创建html⽂档来创建⽹⻚。 HTML代表超⽂ 本标记语⾔。 HTML是⼀种标记语⾔,它具有标记标签的集合。 HTML标签是由尖括号括起来的词,如 , 。标签通常成对出现,例如 和 。 ⼀对中的第⼀个标签是开始标签;第⼆个标签是结束标签。在上⾯的示例中, 是开始标签,⽽ 是结束标签。 我们还可以将开始标签...

05:最大值和最小值的差

原题链接 总时间限制:  1000ms  内存限制:  65536kB 描述 输出一个整数序列中最大的数和最小的数的差。 输入 第一行为M,表示整数个数,整数个数不会大于10000; 第二行为M个整数,以空格隔开,每个整数的绝对值不会大于10000。 输出 输出M个数中最大值和最小值的差。 样例输入 样例输出 源码...

java判断奇偶数注意点

如果让我们用java写一个方法来判断一个整数是奇数还是偶数,相信很多人很快能写出来,而其中可能就会有下面这种: 这样写有没有什么问题呢? 初步看,没什么问题,不过,真没问题吗?输入-1试试看: 结果为false诶,难道-1不是奇数?赶紧换成-3在试试,结果还是false。 究竟发生了什么,我们看看-1和-3分别与2求余是什么结果: 结果都是-1,这就要引出java的一个特性了,java求余结果与左...

mac终端使用ssh连接虚拟机(也就是连接远程服务器)

配置host 我们可以借助第三方工具SwitchHosts;SwitchHosts是开源的,可免费下载 本机ip地址是常开状态,我们公司还有一个预发布环境的host需要配置,跟本地配置host是一样的,只是ip不一样。 本地配置host如下图: ssh连接虚拟机 mac终端自带ssh,不需要我们下载任何东西 ps:虚拟机的账号和密码需要公司给你开 直接上命令 这样就连上你的虚拟机了,如下图所示: ...

DBSCAN聚类算法原理

概念 ϵ邻域: 给定点的ϵ为半径的区域 核心点(core points): 如果点p的ϵ邻域内的点数大于minPts,那么p是核心点 直接可达(directly reachable): 核心点p到其ϵ邻域内的所有点是直接可达的。(注意必须是p必须是核心点) 可达(reachable): 如果存在一条路径p1=p,p2,...,pn−1,pn=q,如果对于任意i,pi到pi+1是直接可达...