我正在写一个基于qt
的c++应用程序。我有一些我想互相排斥的按钮-一次只能切换一个。我通常为此使用QButtonGroup-它提供了一种管理按钮集的不错的逻辑方法。当一个被按下时,先前被按下的一个就不被按下,这正是我想要的行为。
但是,这次我想允许该组完全不受检查。不幸的是,QButtonGroup
似乎不允许这样做:
当然,有许多方法可以解决此问题。我想知道是否有QButtonGroup
的预制替代品可以允许这种行为,因此1)我没有重新发明轮子,并且2)我可以留在惯用的qt
中以使将来的项目管理更轻松。
有什么建议么?
最佳答案
为了完整起见,我想在这里发布该问题的一种可能的解决方案,因为我只是针对我的情况进行了解决。请注意,以下代码对Qt3有效。对于Qt4和Qt5来说,它可能也很有效,因为它使用的东西并不多。
因此,我假设我在某个地方有一个小部件CustomWidget,其中包含按钮(CustomButton类型),并且只能打开一个按钮。如果单击窗口小部件中的另一个按钮,则当前打开的按钮将关闭,而新单击的按钮将打开。
CustomWidget中包含的CustomButtons通过以下方式全部包含在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);
}
然后小部件的行为就如您所愿。
关于qt - QButtonGroup的替代选择,不允许选择?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15177771/