c++qtwizardqt4.8

Qt: How to pass variable value betweeen QWizardPages with registerField()


I'm working on Qt 4.8.5. I'm using a QWizard structure with its QWizardPages (lets name them wp1, wp2, wp3,...). I need to pass one value from wp2 to wp4 but every time I try it, I get an empty string :( The value I need is on a variable (QString sVar;) so not a widget and I've tried some things:

  1. Using RegisterField with the wizardpage itselfs (as its still a type of qwidget) like this: registerField("myField",this); but ofcourse when i go to wp4 and try to qDebug()<< "data: " << field("myField").toString();it is empty.
  2. I've see in some forums ppl saying that you can create a Q_PROPERTY and then use the register field. I've set it as Q_PROPERTY sData READ getData() WRITE setDATA() and then with registerField("myfield, this, ...and here I have a problem because i expect sData to apear but it doesn't.

So... any idea about how can I achieve this using registerField (I know I can also create my own slot and signal, emit it from wp2 and catch it up on wp4 but I would like to avoid it if possible)

Added the solution:

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 A constructor:

registerField("AP_field",this, "sAP", SIGNAL(APChanged()));

Class A ::initializePage() function:

switch(m_iVar)
{
case 0 :...
    break;
case 1: 
    setAP("AP1");
    emit APChanged();
    break;
}

And then in Class B (Where you need to know that data):

qDebug() << " AP QPROPERTY = " <<field ("AP_Field").toString();

Solution

  • According to the 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.

    So you still need a signal, but Qt will handle necessary connections for you and will catch your new value as you change it. You have to register like this:

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

    Then you have to remember to emit the signal each time you change your variable, and of course register it as a property.