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