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

时间:2015-12-24 12:09:49

标签: c++ qt wizard qt4.8

我正在研究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. 我在一些论坛中看到ppl说你可以创建一个Q_PROPERTY,然后使用register字段。我将其设置为Q_PROPERTY sData READ getData() WRITE setDATA(),然后设置为registerField("myfield, this, ...,此处我遇到了问题,因为我希望sData能够出现,但事实并非如此。
  3. 所以......关于如何使用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();
    

2 个答案:

答案 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我希望这永远不会困扰其他人和这个完整的解决方案,没有警告,错误或不可预测的行为。