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

效果:

创新互联建站主营清河网站建设的网络公司,主营网站建设方案,成都App制作,清河h5成都微信小程序搭建,清河网站营销推广欢迎清河等地区企业咨询

12cd9362e822441c9849349b7a775038.png

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

两种方法:

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

private:
	std::mapmapUI;
	std::mapmapIndex;

然后就是创建界面以及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);

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

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享标题:qt/c++其它按钮控件(如QPushButton)实现单选效果-创新互联
网页路径:http://scyanting.com/article/cdojed.html