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

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

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

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

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

添加解决方案:

Class 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;

Class一个构造函数:

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

Class ::initializePage() 函数:

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

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

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

根据 docs:

When we create a field using QWizardPage::registerField(), we pass a unique field name and a widget. We can also provide a Qt property name and a "changed" signal (a signal that is emitted when the property changes) as third and fourth arguments; however, this is not necessary for the most common Qt widgets, such as QLineEdit, QCheckBox, and QComboBox, because QWizard knows which properties to look for.

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

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

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

这适用于一些但不是所有发出信号的小部件。对于 QDoubleSpinWidgets, QWizard::setDefaultProperty("QDoubleSpinBox", "value", SIGNAL(valueChanged(double))); 这是因为 valueChanged() 用于 QString 和 double....在没有指定参数的情况下不知道要采用哪个值: "Every time the value changes QDoubleSpinBox emits two valueChanged() signals, one taking providing a double and the other a QString. The QString overload provides the value with both prefix() and suffix(). The current value can be fetched with value() and set with setValue()." doc.qt.io/qt-5/qdoublespinbox.html 我希望这不会给其他人带来麻烦,这个完整的解决方案,没有警告、错误或不可预测的行为。