QButtonGroup的替代品,不允许选择?

tmp*_*rce 5 qt radio-button

我正在编写一个qt基于c ++的应用程序.我有一些我希望互相排斥的按钮 - 一次只能切换一个按钮.我通常使用QButtonGroup - 它提供了一种很好的逻辑方式来管理按钮组.当一个人被按下时,先前按下的一个被压下,这正是我想要的行为.

但是,这一次,我想允许该组完全不受控制.不幸的是,这似乎是不允许的QButtonGroup:

独家:布尔

此属性保存按钮组是否为独占.

如果此属性为true,则在任何给定时间只能检查组中的一个按钮.用户可以单击任何按钮进行检查,该按钮将替换现有按钮作为组中的选中按钮.

在专用组中,用户无法通过单击取消选中当前选中的按钮; 相反,必须单击组中的另一个按钮才能为该组设置新的选中按钮.

当然,有很多方法可以解决这个问题.我想知道是否有预制替代方案QButtonGroup允许这种行为,以便1)我不是重新发明轮子和2)我可以保持在惯用之中qt,以便将来更轻松地进行项目管理.

有什么建议?

Lau*_*hel 1

为了完整起见,我想在这里发布该问题的一种可能的解决方案,因为我刚刚在我的案例中解决了这个问题。请注意,以下代码对 Qt3 有效。它也适用于 Qt4 和 Qt5,因为它没有使用很多东西。

因此,我假设我在某处有一个小部件 CustomWidget,其中包含按钮(类型为 CustomButton),并且只有一个按钮可以打开。如果单击小部件中的另一个按钮,则当前打开的按钮将关闭,新单击的按钮将打开。

CustomWidget 中包含的 CustomButton 全部包含在 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);
Run Code Online (Sandbox Code Playgroud)

这里,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);
};
Run Code Online (Sandbox Code Playgroud)

您要专门实现的方法是 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);
}
Run Code Online (Sandbox Code Playgroud)

然后小部件就会按照您想要的方式运行。