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;) 上,所以不是小部件,我已经尝试了一些东西:
- 将 RegisterField 与 wizardpage 本身一起使用(因为它仍然是一种 qwidget),如下所示:
registerField("myField",this);
但是当然,当我转到 wp4 并尝试 qDebug()<< "data: " << field("myField").toString();
它是空的。
- 我在一些论坛上看到有人说您可以创建一个 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 我希望这不会给其他人带来麻烦,这个完整的解决方案,没有警告、错误或不可预测的行为。
我正在使用 Qt 4.8.5。我正在使用一个带有 QWizardPages 的 QWizard 结构(我们将它们命名为 wp1、wp2、wp3,...)。我需要将一个值从 wp2 传递到 wp4 但每次尝试时,我都会得到一个空字符串:( 我需要的值在变量 (QString sVar;) 上,所以不是小部件,我已经尝试了一些东西:
- 将 RegisterField 与 wizardpage 本身一起使用(因为它仍然是一种 qwidget),如下所示:
registerField("myField",this);
但是当然,当我转到 wp4 并尝试qDebug()<< "data: " << field("myField").toString();
它是空的。 - 我在一些论坛上看到有人说您可以创建一个 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 我希望这不会给其他人带来麻烦,这个完整的解决方案,没有警告、错误或不可预测的行为。