QT中的自动排放工具按钮

autoexclusive tool buttons in Qt

本文关键字:工具 按钮 QT      更新时间:2023-10-16

在这里,我提出了另一个问题,这次是关于QT工具按钮自动排斥属性的。请在下面找到我的问题:

q)我有4个彼此自动排斥的工具按钮,但是我面临的问题是,当我希望取消选择"选定"按钮时,它不允许我这样做(这是QT中的定义行为),但我想要每个按钮可以相互排斥,并可以在单击选定的按钮时取消选择。谁能帮助我解决这种情况。程序化示例更有帮助。

预先感谢keshav

我有类似的要求,最终为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的过程中触发的,因此您的代码应处理此操作(而不是再次切换操作,这会触发undoggling,这...)

附加完整实现:

#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;
        }
    }
}