【问题标题】:autoexclusive tool buttons in QtQt中的自动排他工具按钮
【发布时间】:2019-03-11 19:38:57
【问题描述】:

在这里,我提出了另一个问题,这次是关于 Qt Tool Buttons AutoExclusive 属性。请在下面找到我的问题:

Q)我有 4 个工具按钮,它们彼此自动排他,但我面临的问题是,当我想取消选择所选按钮时,它不允许我这样做(这是 Qt 中定义的行为)但我想要每个按钮相互排斥,并且可以在单击所选按钮时取消选择它。任何人都可以帮助我解决这种情况。编程示例更有帮助。

提前致谢 凯沙夫

【问题讨论】:

  • QButtonGroup 还不足以满足您的需求?
  • 嗨@eyllanesc ...在 QButtonGroup 如果您设置 autoExclusive ,将始终检查一个按钮我需要的是按钮应该表现为 autoExclusive 并且应该在单击选中的按钮时取消选中。
  • @keshavsingh 我没有问你这个问题,我只是编辑了你的问题

标签: c++ qt qtoolbutton


【解决方案1】:

我也有类似的需求,最终开发了一个用于 QActions 的小容器,其界面大致如下:

class ExclusiveActionGroup : public QObject
{
    Q_OBJECT
public:
    explicit ExclusiveActionGroup(QObject *parent = 0);
    QAction * addAction ( QAction * action );
    const QAction * checkedAction() const;
    void untrigger();

protected slots:
    void slotActionToggled(bool);

private:
    QList<QAction*> actions;
};

slotActionToggled 与添加操作的切换功能挂钩,并处理组的排他性以及整个组的取消选择(取消触发)。 请注意,slotActionToggled 可能会在取消选择相应 QAction 的过程中被触发,因此您的代码应该处理此问题(并且不会再次切换触发取消切换的操作 ...)

ADD-ON 完整实施:

#include "exclusiveactiongroup.h"
#include <QAction>

#if defined(_MSC_VER) && defined(_DEBUG)
#define DEBUG_NEW new( _NORMAL_BLOCK, __FILE__, __LINE__ )
#define new DEBUG_NEW
#endif // _MSC_VER

ExclusiveActionGroup::ExclusiveActionGroup(QObject *parent) :
    QObject(parent)
{
}

QAction * ExclusiveActionGroup::addAction ( QAction * action )
{
    actions.push_back(action);
    connect(action, SIGNAL(toggled(bool)), this, SLOT(slotActionToggled(bool)));
    return action;
}

void ExclusiveActionGroup::slotActionToggled ( bool checked )
{
    QAction* action = qobject_cast<QAction*>(sender());
    if (action && checked)
    {
        foreach(QAction* uncheck, actions)
        {
            if (uncheck != action)
            {
                uncheck->setChecked(false); // triggers recursion, doesnt matter though
            }
        }
    }
}

const QAction* ExclusiveActionGroup::checkedAction() const
{
    foreach(const QAction* a, actions)
    {
        if (a->isChecked())
        {
            return a;
        }
    }
    return 0;
}

void ExclusiveActionGroup::untrigger()
{
    foreach(QAction* a, actions)
    {
        if (a->isChecked())
        {
            a->trigger();
            break;
        }
    }
}

【讨论】:

  • 非常感谢您的回复,如果可能的话,您能否将示例实现发给我。因为我是这个 Qt 小部件实现的新手。
  • 谢谢@Jens。将在我的实现中对其进行测试并更新您。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2020-10-23
  • 2013-02-20
  • 2020-10-19
  • 2019-09-12
相关资源
最近更新 更多