QWizardPage: как повторно отключить кнопку "Далее"

У меня есть QWizardPage где пользователь должен пройти определенные шаги, в конце которых есть кнопка "Тест". Если пользователь нажимает эту кнопку, происходят две вещи:

  1. Кнопка "Далее" активируется для перехода на следующую страницу QWizard, Это достигается путем подачи специального сигнала кнопки, который подключен к QWizardPage:

    this->registerField("test*", m_button, "text", SIGNAL(testDone()));

m_button происходит от QPushButton с пользовательским сигналом testDone(),

  1. Имя кнопки изменено на "Попробовать еще раз", чтобы предложить возможность повторить последовательность шагов снова и снова. Если пользователь нажимает кнопку, элементы графического интерфейса возвращаются в исходное состояние (кроме отключения кнопки "Далее" вQWizard).

Вопрос: для второго сценария, как я могу убедиться, что кнопка "Далее" отключена после того, как она была запущена testDone() сигнал?

Я думал, если я отключу определенный сигнал testDone() от QwizardPage (после того, как это испущено), это дало бы желаемые результаты, однако, это не работало. Я пытался отключить все на QWizardPage (например this->disconnect), но это тоже не сработало. Есть другие идеи?

1 ответ

Решение

Чтобы контролировать готовность страниц, вы обычно переопределяете QWizardPage::isComplete и сигнал меняется через QWizardPage::completeChanged,

Итак, для вашего примера вы можете присвоить кнопке свойство и подключить его соответствующим образом:

class MyButton : public QPushButton
{
    Q_OBJECT

    Q_PROPERTY(bool ready READ isReady NOTIFY readyChanged)

public:
    MyButton(QWidget *parent);
    bool isReady() const;

signals:
    void readyChanged();
};

Всякий раз, когда кнопка нажата или тесты завершены, подайте сигнал и верните желаемое состояние кнопки из функции isReady.

На вашей странице мастера переопределите isComplete как:

bool isComplete() const {
    return QWizardPage::isComplete() && myButton->isReady();
}

и подключите сигналы на своей странице:

connect(myButton, &MyButton::readyChanged, this, &MyPage::completeChanged);
Другие вопросы по тегам