首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替代不允许选择的QButtonGroup?

替代不允许选择的QButtonGroup?
EN

Stack Overflow用户
提问于 2013-03-02 18:17:23
回答 5查看 3.6K关注 0票数 5

我正在编写一个qt-based c++应用程序。我有一些按钮,我想成为相互排斥-只有一个可以在一次切换。为此,我通常使用QButtonGroup --它提供了一种很好的逻辑方法来管理一组按钮。当一个人被压的时候,先前被压的人就会被释放,这正是我想要的行为。

然而,这一次,我想让这个组完全不受约束。不幸的是,QButtonGroup似乎不允许这样做。

独家: bool 此属性保存按钮组是否是独占的。 如果此属性为true,则在任何给定时间只能检查组中的一个按钮。用户可以单击任何按钮来检查它,该按钮将取代组中已选中的按钮。 在独占组中,用户不能通过单击当前选中的按钮来取消选中;相反,必须单击组中的另一个按钮来设置该组的新选中按钮。

当然,有很多方法可以解决这个问题。我想知道是否有一种预先设计好的替代QButtonGroup来允许这种行为,以便1)我不会重新发明轮子,2)我可以留在惯用的qt中,以使将来的项目管理更容易。

有什么建议吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-06-10 13:08:01

为了完整起见,我想在这里公布一个解决这个问题的可能办法,因为我刚刚解决了这个问题。请注意,以下代码对于Qt3是有效的。它可能也适用于Qt4和Qt5,因为它使用的东西不多。

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

CustomButtons中包含在CustomWidget中的所有内容都以以下方式包含在QButtonGroup中:

代码语言:javascript
复制
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

代码语言:javascript
复制
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。如果其机构以下列方式实施:

代码语言:javascript
复制
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);
}

然后,小部件按照您的意愿运行。

票数 1
EN

Stack Overflow用户

发布于 2016-07-28 21:21:14

在Qt5中,我使用了与Laurent类似的解决方案,但使用的是发布事件而不是新闻事件:

代码语言:javascript
复制
// 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);
}
票数 2
EN

Stack Overflow用户

发布于 2019-01-09 09:30:58

另一个类似于前面的答案的解决方案,但使用nextCheckState() --对我来说,这似乎是更自然的扩展点:

代码语言:javascript
复制
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();
}

这取决于关联的QButtonGroupexclusive设置为false。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15177771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档