qt/c++ 其它按钮控件(如QPushButton)实现单选效果

效果:

12cd9362e822441c9849349b7a775038.png

 以上三个按钮只能选择一个

两种方法:

1、利用map容器:QObject到索引以及索引到QObject的映射map。实现稍微繁琐一些,但是笔者觉得这个方法的可扩展性以及实用性等更好。

private:
	std::map<QObject *, unsigned int>mapUI;
	std::map<unsigned int, QObject *>mapIndex;

然后就是创建界面以及pushbutton按钮了

	setWindowTitle(tr("CheckToRadio"));
	resize(300, 400);//窗口

	QVBoxLayout *pTopLayout = new QVBoxLayout(this);
	pTopLayout->setContentsMargins(15, 15, 15, 15);
	setLayout(pTopLayout);//垂直布局

	QString strStyle = "QPushButton:checked{ background: rgb(86, 128, 200); font - weight: bold; }";
//按钮选择之后的颜色值以及字体变化


	QPushButton *pBtn1 = new QPushButton(tr("pBtn1"),this);//按钮1
	mapUI[pBtn1] = 1;
	mapIndex[1] = pBtn1;
	pBtn1->setCheckable(true);
	pBtn1->setStyleSheet(strStyle);
	pTopLayout->addWidget(pBtn1);
	connect(pBtn1, &QPushButton::clicked, this, &CheckToRadio::OnClicked);

	QPushButton *pBtn2 = new QPushButton(tr("pBtn2"), this);//按钮2
	mapUI[pBtn2] = 2;
	mapIndex[2] = pBtn2;
	pBtn2->setCheckable(true);
	pBtn2->setStyleSheet(strStyle);
	pTopLayout->addWidget(pBtn2);
	connect(pBtn2, &QPushButton::clicked, this, &CheckToRadio::OnClicked);

	QPushButton *pBtn3 = new QPushButton(tr("pBtn3"), this);//按钮3
	mapUI[pBtn3] = 3;
	mapIndex[3] = pBtn3;
	pBtn3->setCheckable(true);
	pBtn3->setStyleSheet(strStyle);
	pTopLayout->addWidget(pBtn3);
	connect(pBtn3, &QPushButton::clicked, this, &CheckToRadio::OnClicked);

可以看到我用两个成员变量mapUI和mapIndex保存了按钮和索引之间的映射,接下来就是槽函数OnClicked的实现:

void CheckToRadio::OnClicked()
{
	QPushButton *pBtn = (QPushButton *)sender();//获取所选择的按钮
	unsigned int uID = mapUI[pBtn];//通过按钮获取索引
	for (int i = 1; i <= mapUI.size(); i++)
	{
		QPushButton *pBtnTem = (QPushButton *)mapIndex[i];
		if (i != uID)
		{
			pBtnTem->setChecked(false);
		}else
			pBtnTem->setChecked(true);
	}
}

 

2、利用setAutoExclusive(bool)函数:

//只需要在定义按钮时,setAutoExclusive(true)就可以实现单选效果,但是
//要注意后续定义的按钮如果不进行处理的话也可能会有单选效果bug
    QPushButton *pBtn1 = new QPushButton(tr("pBtn1"),this);
// 	mapUI[pBtn1] = 1;
// 	mapIndex[1] = pBtn1;
	pBtn1->setCheckable(true);
	pBtn1->setStyleSheet(strStyle);
	pBtn1->setAutoExclusive(true);
	pTopLayout->addWidget(pBtn1);
//	connect(pBtn1, &QPushButton::clicked, this, &CheckToRadio::OnClicked);

	QPushButton *pBtn2 = new QPushButton(tr("pBtn2"), this);
// 	mapUI[pBtn2] = 2;
// 	mapIndex[2] = pBtn2;
	pBtn2->setCheckable(true);
	pBtn2->setStyleSheet(strStyle);
	pBtn2->setAutoExclusive(true);
	pTopLayout->addWidget(pBtn2);
//	connect(pBtn2, &QPushButton::clicked, this, &CheckToRadio::OnClicked);

	QPushButton *pBtn3 = new QPushButton(tr("pBtn3"), this);
// 	mapUI[pBtn3] = 3;
// 	mapIndex[3] = pBtn3;
	pBtn3->setCheckable(true);
	pBtn3->setStyleSheet(strStyle);
	pBtn3->setAutoExclusive(true);
	pTopLayout->addWidget(pBtn3);
//	connect(pBtn3, &QPushButton::clicked, this, &CheckToRadio::OnClicked);

比较方便快捷的方法,如果只希望实现单选效果,使用第二种方法即可,减少代码冗余。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值