我正在写一个基于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/

10-10 01:03