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

问题描述 投票:1回答:2

我正在研究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();it是空的。
  2. 我在一些论坛中看到ppl说你可以创建一个Q_PROPERTY,然后使用register字段。我把它设置为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();
c++ qt wizard qt4.8
2个回答
2
投票

根据docs

当我们使用QWizardPage :: registerField()创建一个字段时,我们传递一个唯一的字段名称和一个小部件。我们还可以提供Qt属性名称和“已更改”信号(属性更改时发出的信号)作为第三和第四个参数;但是,对于最常见的Qt小部件,例如QLineEdit,QCheckBox和QComboBox,这不是必需的,因为QWizard知道要查找哪些属性。

所以你仍然需要一个信号,但Qt将为你处理必要的连接,并在你改变时捕获你的新值。你必须这样注册:

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

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


0
投票

这适用于发出信号的一些但不是所有小部件。对于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我希望这永远不会让别人和这个完整的解决方案麻烦,没有警告,错误或不可预测的行为。

© www.soinside.com 2019 - 2024. All rights reserved.