Qt:如何使用registerField()在QWizardPages之间传递变量值

Qt: How to pass variable value betweeen QWizardPages with registerField()

本文关键字:之间 QWizardPages 变量值 何使用 registerField Qt      更新时间:2023-10-16

我正在研究Qt 4.8.5。我使用QWizard结构及其QWizardPages(让我们将它们命名为wp1、wp2、wp3…)。我需要从wp2向wp4传递一个值,但每次尝试时,我都会得到一个空字符串:(我需要的值在一个变量(QString sVar;)上,所以不是一个小部件,我已经尝试了一些东西:

  1. 将RegisterField与wizardpage一起使用(因为它仍然是一种qwidget),如下所示:registerField("myField",this);,但当然,当我转到wp4并尝试qDebug()<< "data: " << field("myField").toString();时,它是空的
  2. 我在一些论坛上看到有人说,你可以创建一个Q_PROPERTY,然后使用register字段。我把它设置为Q_PROPERTY sData READ getData() WRITE setDATA(),然后用registerField("myfield, this, ...,这里我有一个问题,因为我希望sData会出现,但它没有

所以。。。关于如何使用registerField实现这一点的任何想法(我知道我也可以创建自己的插槽和信号,从wp2发出并在wp4上赶上它,但如果可能的话,我想避免它)

添加了解决方案:

A.h级:

class ClassA: public QWizardPage
{
    Q_OBJECT
    Q_PROPERTY(QString sAP READ getAP WRITE setAP)
    ....
   public:
         QString getAP() const {return AP;}
         void setAP(QString s){AP=s;};
   private:
         QString AP;

A类构造函数:

registerField("AP_field",this, "sAP", SIGNAL(APChanged()));

A类::initializePage()函数:

switch(m_iVar)
{
case 0 :...
    break;
case 1: 
    setAP("AP1");
    emit APChanged();
    break;
}

然后在B类(你需要知道数据的地方):

qDebug() << " AP QPROPERTY = " <<field ("AP_Field").toString();

根据文档:

当我们使用QWizardPage::registerField()创建字段时,我们传递唯一的字段名和一个小部件。我们还可以提供Qt属性名称以及"更改"信号(当属性变化)作为第三和第四自变量;但是,这不是必须的用于最常见的Qt小部件,如QLineEdit、QCheckBox和QComboBox,因为QWizard知道要查找哪些属性。

所以你仍然需要一个信号,但Qt会为你处理必要的连接,并在你更改它时捕获你的新值。你必须这样注册:

registerField("myField", this, "myProperty", SIGNAL(myPropertyChanged()));

然后,您必须记住每次更改变量时都要发出信号,当然还要将其注册为属性。

这适用于一些但不是所有发出信号的小部件。对于QDoubleSpinWidgets,QWizard::setDefaultProperty("QDoubleSpinBox", "value", SIGNAL(valueChanged(double)));这是因为值Changed()用于QString和double。。。。不知道在没有指定参数的情况下要取哪个值:"每次值更改时,QDdoubleSpinBox都会发出两个valueChanged()信号,一个提供double,另一个提供QString。QString重载为值提供前缀()和后缀()。当前值可以用value()获取,也可以用setValue()设置。"doc.qt.io/qt-5/QDoubleSpinBox.html我希望这永远不会困扰其他人,希望这个完整的解决方案没有任何警告,错误或不可预测的行为。