QCheckBox управление поведением при Qt::PartiallyChecked

Имеется таблица с QCheckBox в первом столбце. В ней могут быть неактивные строки, где галочку в QCheckBox поставить нельзя.

Состояние QCheckBox на -1 позиции рассчитывается программно. И может быть установлена в Qt::PartiallyChecked.

Дальнейшие клики устанавливают это значение в Qt::Checked, а код, имея неактивные строки снова меняет его в Qt::PartiallyChecked. И так по кругу. То есть, снять галочку можно только при всех активных строках. Только на этом основании значение может быть установлено в Qt::Checked, а следующий клик поменяет его на Qt::Unchecked.

Как реализовать смену Qt::PartiallyChecked на Qt::Unchecked при клике? Например, запретить Qt менять значение и делать это программно по событию QCheckBox::clicked.


Ответы (1 шт):

Автор решения: eugesh

Извините за задержку, понятия не имею, зачем Вам это надо, но для изменения порядка состояний нужно реализовать класс, назовем его InvertedCheckBox, и переопределить метод nextCheckState, например:

void InvertedCheckBox::nextCheckState()
{
    if (!isTristate())
        return;

    if (checkState() == Qt::PartiallyChecked) {
        setCheckState(Qt::Unchecked);
    } else if (checkState() == Qt::Unchecked) {
        setCheckState(Qt::Checked);
    } else if (Qt::Checked) {
        setCheckState(Qt::PartiallyChecked);
    }
}

Класс:

class InvertedCheckBox : public QCheckBox
{
    Q_OBJECT
public:
    InvertedCheckBox(QWidget *parent = nullptr);
protected:
    virtual void nextCheckState() override;
};

Конструктор:

InvertedCheckBox::InvertedCheckBox(QWidget *parent)
{

}
→ Ссылка