我正在编写一个qt-based c++应用程序。我有一些按钮,我想成为相互排斥-只有一个可以在一次切换。为此,我通常使用QButtonGroup --它提供了一种很好的逻辑方法来管理一组按钮。当一个人被压的时候,先前被压的人就会被释放,这正是我想要的行为。
然而,这一次,我想让这个组完全不受约束。不幸的是,QButtonGroup似乎不允许这样做。
独家: bool 此属性保存按钮组是否是独占的。 如果此属性为true,则在任何给定时间只能检查组中的一个按钮。用户可以单击任何按钮来检查它,该按钮将取代组中已选中的按钮。 在独占组中,用户不能通过单击当前选中的按钮来取消选中;相反,必须单击组中的另一个按钮来设置该组的新选中按钮。
当然,有很多方法可以解决这个问题。我想知道是否有一种预先设计好的替代QButtonGroup来允许这种行为,以便1)我不会重新发明轮子,2)我可以留在惯用的qt中,以使将来的项目管理更容易。
有什么建议吗?
发布于 2015-06-10 13:08:01
为了完整起见,我想在这里公布一个解决这个问题的可能办法,因为我刚刚解决了这个问题。请注意,以下代码对于Qt3是有效的。它可能也适用于Qt4和Qt5,因为它使用的东西不多。
因此,我假设在某个地方有一个小部件CustomWidget,其中包含按钮(类型为CustomButton),并且只有一个按钮可以打开。如果单击小部件中的另一个按钮,则当前打开的按钮被关闭,新单击的按钮被打开。
CustomButtons中包含在CustomWidget中的所有内容都以以下方式包含在QButtonGroup中:
QButtonGroup* m_ButtonGroup = new QButtonGroup(this);
m_ButtonGroup->hide();
m_ButtonGroup->insert(Btn1);
m_ButtonGroup->insert(Btn2);
m_ButtonGroup->insert(Btn3);
m_ButtonGroup->setExclusive(true);在这里,Btn1、Btn2和Btn3的类型是CustomButton
class CustomButton : public QToolButton
{
Q_OBJECT
public:
CustomButton (QWidget* apo_parent = 0, const char* as_name = 0);
virtual ~CustomButton ();
protected:
virtual void mousePressEvent(QMouseEvent* a_Event);
};您要特别实现的方法是mousePressEvent。如果其机构以下列方式实施:
void CustomButton ::mousePressEvent(QMouseEvent* a_Event)
{
if(group() && isToggleButton())
{
CustomButton* selectedButton(dynamic_cast<CustomButton*>(group()->selected()));
if(selectedButton)
{
if(selectedButton->name() == name())
{
group()->setExclusive(false);
toggle();
group()->setExclusive(true);
return;
}
}
}
QToolButton::mousePressEvent(a_Event);
}然后,小部件按照您的意愿运行。
发布于 2016-07-28 21:21:14
在Qt5中,我使用了与Laurent类似的解决方案,但使用的是发布事件而不是新闻事件:
// Allow to uncheck button in exclusive group
void CustomButton::mouseReleaseEvent(QMouseEvent* a_Event) {
if(group()->checkedId()==group()->id(this)) {
if(isDown()) group()->setExclusive(false);
}
QToolButton::mouseReleaseEvent(a_Event);
group()->setExclusive(true);
}发布于 2019-01-09 09:30:58
另一个类似于前面的答案的解决方案,但使用nextCheckState() --对我来说,这似乎是更自然的扩展点:
void MyButton::setSemiExclusive(bool value)
{
mSemiExclusive = value;
}
void MyButton::nextCheckState()
{
if (mSemiExclusive)
{
if (auto g = group())
{
auto old = g->exclusive();
if (g->checkedButton() != this)
g->setExclusive(true);
QAbstractButton::nextCheckState();
g->setExclusive(old);
return;
}
}
QAbstractButton::nextCheckState();
}这取决于关联的QButtonGroup将exclusive设置为false。
https://stackoverflow.com/questions/15177771
复制相似问题