QWizardPage:如何重新禁用 "Next" 按钮

QWizardPage: how to re-disable "Next" button

我有一个 QWizardPage,用户应该在其中完成某些步骤,最后有一个按钮 "Test"。如果用户按下那个按钮,会发生两件事:

  1. "Next" 按钮启用,以便转到 QWizard 的下一页。这是通过发出连接到 QWizardPage 的按钮的特殊信号来实现的:

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

m_button 派生自 QPushButton,带有自定义信号 testDone()

  1. 按钮名称更改为 "Try again" 以提供重新尝试一系列步骤的选项。如果用户按下按钮,GUI 元素 return 将变为初始状态( 除了在 QWizard 上禁用按钮 "Next" 外)。

问题是:对于第二种情况,如何确保 "Next" 按钮在被发射的 testDone() 信号启用后被禁用?

我想如果我断开特定信号 testDone()QwizardPage 的连接(在它发出后),它会给出预期的结果,但是,它没有用。我试图断开 QWizardPage 上的所有连接(例如 this->disconnect),但这也没有用。还有其他想法吗?

要控制页面 "readyness",您通常会覆盖 QWizardPage::isComplete and signal changes via 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();
};

每当按下按钮或完成测试时,都会发出信号,并且 return 来自 isReady 函数的所需按钮状态。

在您的向导页面中,将 isComplete 替换为:

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

并连接您页面中的信号:

connect(myButton, &MyButton::readyChanged, this, &MyPage::completeChanged);