Автоэксклюзивные кнопки инструментов в Qt - PullRequest
0 голосов
/ 11 марта 2019

Здесь я задаю другой вопрос, на этот раз касающийся свойства AutoExclusive кнопок Qt Tool Buttons.Пожалуйста, найдите мой вопрос ниже:

Q) У меня есть 4 кнопки инструментов, которые автоматически исключают друг друга, но проблема, с которой я сталкиваюсь, заключается в том, что я хочу отменить выбор выбранной кнопки, это не позволяет мне сделать это (этоопределенное поведение в Qt), но я хочу, чтобы каждая кнопка была взаимоисключающей, а также чтобы можно было отменить ее выбор при нажатии выбранной кнопки.Может ли кто-нибудь помочь мне с этим сценарием.Программные примеры гораздо более полезны.

Спасибо заранее Keshav

1 Ответ

1 голос
/ 11 марта 2019

У меня было аналогичное требование, и я закончил разработку небольшого контейнера для 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;
        }
    }
}
...