Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Connecting QPushButton of QWizardPage with NextButton of QWizard!



  • Hi, how could I connect a QPushButton of a QWizardPage with the Next Button of Qwizard?
    What I want is: when I click in the QPushButton created in the QWizardPage, the page goes to the next screen.
    Thanks!


  • Lifetime Qt Champion

    Hi
    there is void QWizard::next() slot
    so you can connect buttons clicked to that.



  • @mrjj How could I use QWizard::next() inside a QWizardPage?
    Is there any example?


  • Lifetime Qt Champion

    @Pedro_Monteiro
    its a slot so u just send signal to by binding it to the signal a button gives.

    connect( Wizpage->pushButton, SIGNAL(released()), QWizardPointer, SLOT(next()));

    Maybe you need to connect it where you create the wizpages as there it both knows the button and the Wizard.



  • @mrjj said in Connecting QPushButton of QWizardPage with NextButton of QWizard!:

    @Pedro_Monteiro
    its a slot so u just send signal to by binding it to the signal a button gives.

    connect( Wizpage->pushButton, SIGNAL(released()), QWizardPointer, SLOT(next()));

    Maybe you need to connect it where you create the wizpages as there it both knows the button and the Wizard.

    @mrjj I can't seem to get this to work :(

    Would you be able to help with the correct 'connect' line?
    I've current got:

    connect(button, SIGNAL(pressed()), &myWizard, SLOT(next()));
    

    Here is the code:

    From my myWizard.cpp

    myWizard::myWizard(QWidget *parent)
        : QWizard(parent)
    {
        setPage(Page_Intro, new IntroPage);
        setPage(Page_1, new firstPage);
        setPage(Page_2, new secondPage);
    
        setStartId(Page_Intro);
    
    #ifndef Q_OS_MAC
        setWizardStyle(ModernStyle);
    #endif
    
        setOption(HaveHelpButton, true);
        setPixmap(QWizard::LogoPixmap, QPixmap(":/img/logo.png"));
        connect(this, &QWizard::helpRequested, this, &myWizard::showHelp);
        setWindowTitle(tr("This is my wizard"));
    }
    
    firstPage::firstPage(QWidget *parent)
        : QWizardPage(parent)
    {
        setTitle(tr("This is my first page"));
        setSubTitle(tr("Select from the options below"));
    
        list = new QListWidget();
    
        item0 = new QListWidgetItem(QStringLiteral("Item 0"));
    
        item1 = new QListWidgetItem(QStringLiteral("Item 1"));
    
        item2 = new QListWidgetItem(QStringLiteral("Item 2"));
    
        list->addItem(item0);
        list->addItem(item1);
        list->addItem(item2);
    
        listDescription = new QLabel();
        listDescription->setWordWrap(true);
    
        button = new QPushButton("My Button");
        buttonPressed= false;
    
        connect(list, SIGNAL(currentRowChanged(int)), this, SLOT(changeDescription(int)));
    
    //***************************TRYING TO GET THIS RIGHT****************************************
        connect(button, SIGNAL(pressed()), &myWizard, SLOT(next()));
    //*******************************************************************************************
    
        QGridLayout *layout = new QGridLayout;
        layout->addWidget(list, 0,0);
        layout->addWidget(listDescription, 0, 1, Qt::AlignTop);
        layout->addWidget(button, 1,1);
        layout->setColumnStretch(0,1);
        layout->setColumnStretch(1,1);
        setLayout(layout);
    
        connect(list, SIGNAL(itemSelectionChanged()), this, SIGNAL(completeChanged()));
    }
    

  • Lifetime Qt Champion

    Hi

    Hi
    About
    connect(button, SIGNAL(pressed()), &myWizard, SLOT(next()));

    What is the issue do you get a error ?
    Is myWizard a member firstPage ?
    It has to be the actual QWizard you have on MainWindow and not a new one.

    Or is that the actual issue?
    You are unsure how to connect to the
    https://doc.qt.io/qt-5/qwizard.html#next ?

    Well if you give it the QWizard as a parent in
    FirstPage(QWidget *parent)
    When you are inside pages, you could do

    QWizard *wiz=qobject_cast<QWizard *> (parentWidget());

    and then do
    bool worked=connect(button, SIGNAL(pressed()), wiz, SLOT(next()));
    qDebug() << "it worked:" << worked;

    which will work If the parent is the QWizard.

    You can also define some pr signals for the page that you can emit from inside the page to go back and forth.



  • @mrjj

    Thanks for the fast reply! Yes exactly, I am unsure how to connect a button press on my wizard page to my QWizard's next slot. My current connect statement says "error: 'myWizard' does not refer to a value"

    I tried your suggestion, but it didn't work either. I get this error:
    "QObject::connect: Cannot connect QPushButton::pressed() to (nullptr)::next()"
    I suspect I haven't allocated the parent correctly maybe?

    I also dont understand what you mean by: "Is myWizard a member firstPage ?"

    Maybe it will help if I explain what I'm trying to do. I'm setting up a wizard which will have multiple pages. On one of the pages, it will include a pushbutton. If that pushbutton is clicked, I want it to take me to a side page which only has the back button enabled. The flow would be something like below, with the pushbutton being on Page 3, which takes me to Side_Page.

    Page 1 
      ↓
    Page 2
      ↓
    Page 3 (pushbutton on this page) ←→ Side_Page
      ↓
    Page 4
      ↓
    Page 5 
      ↓
    ....etc
    

    I though that if I get the pushbutton connected to the wizard's next(), then in the nextId(), I could check if the button was pressed (not figured out how to do that yet), and return Page 4 if the button was not pressed, but return Side_Page if the button was pressed.

    Maybe there is a better way to achieve this?


  • Lifetime Qt Champion

    Hi

    I tried your suggestion, but it didn't work either. I get this error:
    "QObject::connect: Cannot connect QPushButton::pressed() to (nullptr)::next()"
    I suspect I haven't allocated the parent correctly maybe?

    Update: To future readers. One can use wizard() inside "Pages" so please see later post.

    Well it means the parent is not a QWizard,
    when you do
    firstPage * fp = new firstPage(this); <<< the this is the parent
    so I had hoped it would be the actual QWizard instance.
    By instance, i mean where you do
    myWizard * mw= myWizard();
    The myWizard is the one you need for connection.
    But since you want to connect inside the pages, we need access to this pointer.

    but i think this creates the pages , right ?

    Could you try

    setPage(Page_Intro, new IntroPage(myWizard ));
    so it get the actual QWizrd as parent ?
    (for all pages)

    Maybe it will help if I explain what I'm trying to do. I'm setting up a wizard which will have multiple pages. On one of the pages, it will include a pushbutton. If that pushbutton is clicked, I want it to take me to a side page which only has the back button enabled. The flow would be something like below, with the pushbutton being on Page 3, which takes me to Side_Page.

    Ok. so this side page is outside of the main flow ? so to speak.

    I though that if I get the pushbutton connected to the wizard's next(), then in the nextId(), I could check if the button was pressed (not figured out how to do that yet), and return Page 4 if the button was not pressed, but return Side_Page if the button was pressed.

    Maybe there is a better way to achieve this?

    Well using nextId sounds good. but the part of knowing if the button was clicked, will require a variable to keep track of that.

    You could also just define a new signal ( in that page class)
    signals:
    void GotoSidePage();

    and connect that to a slot in myWizard, that actually set the page to this side page.

    and for the (pushbutton on this page), you connect to a slot that does

    emit GotoSidePage();

    Then myWizard can just show that page.



  • Could you try

    setPage(Page_Intro, new IntroPage(myWizard ));
    so it get the actual QWizrd as parent ?
    (for all pages)

    This doesn't work :(
    It gives me "error: 'myWizard' does not refer to a value"

    Ok. so this side page is outside of the main flow ? so to speak.

    Yes exactly!

    I though that if I get the pushbutton connected to the wizard's next(), then in the nextId(), I could check if the button was pressed (not figured out how to do that yet), and return Page 4 if the button was not pressed, but return Side_Page if the button was pressed.

    Maybe there is a better way to achieve this?

    Well using nextId sounds good. but the part of knowing if the button was clicked, will require a variable to keep track of that.

    I've set a bool 'buttonPressed' to try and keep track.

    You could also just define a new signal ( in that page class)
    signals:
    void GotoSidePage();

    and connect that to a slot in myWizard, that actually set the page to this side page.

    and for the (pushbutton on this page), you connect to a slot that does

    emit GotoSidePage();

    Then myWizard can just show that page.

    I'd still be in the same dilemma though right? Because I'd still have to connect a signal from the page, to a slot in the wizard. Which is the same as trying to connect a button press signal on the page to the next() slot in the wizard?

    Should I be setting the parent of each page here?

    class firstPage: public QWizardPage
    {
        Q_OBJECT
    
    public:
        firstPage(QWidget *parent = nullptr);
    
    

    I tried firstPage(QWidget *parent = myWizard::myWizard); but I get error: qualified reference to 'myWizard' is a constructor name rather than a type in this context.

    If it makes any difference, I've basically used the Qt wizard example https://doc.qt.io/qt-5/qtwidgets-dialogs-licensewizard-example.html as a basis. My setup is exactly the same.



  • @mrjj oh I just realised maybe I should clarify that I launch the wizard from my mainwindow.cpp. The user clicks a button which triggers a function that has this code:

    myWizard wizard;
    wizard.exec();
    

  • Lifetime Qt Champion

    @AhmedAlshawi

    • If it makes any difference, I've basically used the Qt wizard example

    Hi
    Yes that helped a lot :)

    There is a much easier way to connect. Sorry about that. I forgot.
    So no need to change parents or anything.

    Inside the pages, you can use wizard()
    to get access to the QWizard

    So your button can be connected like

    connect(button, SIGNAL(pressed()), wizard(), SLOT(next()));



  • @mrjj

    connect(button, SIGNAL(pressed()), wizard(), SLOT(next()));

    It worked!! So simple. Really appreciated thank you. I can access any of the wizard functions with just wizard()->

    How did I miss that haha!


  • Lifetime Qt Champion

    @AhmedAlshawi
    Hurrray :)
    Hehe yeah, Same though for myself too. I even fast check the doc. but Missed it.
    First when you said what sample you used as a base, I saw it and went

    🤦‍♀️

    But on the bright side, i wont forget again :)


Log in to reply