【问题标题】:QWizardPage: how to re-disable "Next" buttonQWizardPage:如何重新禁用“下一步”按钮
【发布时间】:2018-03-29 16:13:57
【问题描述】:

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

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

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

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

  1. 按钮名称更改为“重试”,以便提供重新尝试一系列步骤的选项。如果用户按下按钮,GUI 元素将返回初始状态(除了禁用 QWizard 上的“下一步”按钮)。

问题是:对于第二种情况,如何确保“下一步”按钮在被发出的testDone() 信号启用后被禁用?

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

【问题讨论】:

    标签: qt signals-slots qwizard qwizardpage


    【解决方案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);
    

    【讨论】:

    • 行得通,谢谢!了解如何在此上下文中使用 Q_PROPERTY 也很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2023-04-07
    • 1970-01-01
    • 2015-02-10
    • 2013-11-15
    • 2011-02-03
    相关资源
    最近更新 更多