我正在研究Qt 4.8.5。我正在使用QWizard结构及其QWizardPages(让我们将它们命名为wp1,wp2,wp3,...)。我需要将一个值从wp2传递给wp4,但每次尝试时,我都会得到一个空字符串:(我需要的值是一个变量(QString sVar;)所以不是一个小部件,我尝试过一些东西:
registerField("myField",this);
但当然我去wp4并尝试qDebug()<< "data: " << field("myField").toString();
it是空的。Q_PROPERTY sData READ getData() WRITE setDATA()
,然后在registerField("myfield, this, ...
and这里我有一个问题,因为我希望sData到apear但它没有。所以......关于如何使用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();
根据docs:
当我们使用QWizardPage :: registerField()创建一个字段时,我们传递一个唯一的字段名称和一个小部件。我们还可以提供Qt属性名称和“已更改”信号(属性更改时发出的信号)作为第三和第四个参数;但是,对于最常见的Qt小部件,例如QLineEdit,QCheckBox和QComboBox,这不是必需的,因为QWizard知道要查找哪些属性。
所以你仍然需要一个信号,但Qt将为你处理必要的连接,并在你改变时捕获你的新值。你必须这样注册:
registerField("myField", this, "myProperty", SIGNAL(myPropertyChanged()));
然后你必须记住每次更改变量时发出信号,当然还要将其注册为属性。
这适用于发出信号的一些但不是所有小部件。对于QDoubleSpinWidgets,QWizard::setDefaultProperty("QDoubleSpinBox", "value", SIGNAL(valueChanged(double)));
这是因为valueChanged()用于QString而double ....在没有参数指定的情况下不知道要采用哪个值:“每次值更改时QDoubleSpinBox发出两个valueChanged()信号,一个提供一个qString重载提供带有prefix()和suffix()的值。当前值可以使用value()获取并使用setValue()设置。“ doc.qt.io/qt-5/qdoublespinbox.html我希望这永远不会让别人和这个完整的解决方案麻烦,没有警告,错误或不可预测的行为。