[SOLVED] Parent and Child Window Communication in Qt - Child Window opens twice



  • I have two windows, one parent and one child. In parent window, I have a Next button, which onClick()'ed, opens up child window, but in my case two child windows are opening, what is the mistake am doing!?

    Here are my codes:

    .h files

    mainwindow.h

    @#ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include <QMainWindow>
    #include <info.h>
    #include <QtGui>

    namespace Ui {
    class MainWindow;
    }

    class MainWindow : public QMainWindow {
    Q_OBJECT
    public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

    protected:
    void changeEvent(QEvent *e);

    private:
    Ui::MainWindow *ui;
    void setSignals();

    private slots:
    void process();
    };

    #endif // MAINWINDOW_H@

    info.h

    @#ifndef INFO_H
    #define INFO_H

    #include <QMainWindow>

    namespace Ui {
    class info;
    }

    class info : public QMainWindow {
    Q_OBJECT
    public:
    info(QWidget *parent = 0);
    ~info();

    protected:
    void changeEvent(QEvent *e);

    private:
    Ui::info *ui;
    };

    #endif // INFO_H@

    .cpp files

    mainwindow.cpp

    @#include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QtGui/QApplication>

    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    ui->setupUi(this);
    setSignals();
    }

    MainWindow::~MainWindow()
    {
    delete ui;
    }

    void MainWindow::changeEvent(QEvent *e)
    {
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
    ui->retranslateUi(this);
    break;
    default:
    break;
    }
    }

    void MainWindow::setSignals(){
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(process()));
    connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(close()));
    }

    void MainWindow::process(){
    info *i;
    i = new info;
    this -> hide();
    i -> show();
    }@

    info.cpp

    @#include "info.h"
    #include "ui_info.h"

    info::info(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::info)
    {
    ui->setupUi(this);
    }

    info::~info()
    {
    delete ui;
    }

    void info::changeEvent(QEvent *e)
    {
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
    ui->retranslateUi(this);
    break;
    default:
    break;
    }
    }@

    main.cpp

    @#include <QtGui/QApplication>
    #include "mainwindow.h"

    int main(int argc, char *argv[])
    {
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
    }@



  • did you double click on the button?

    did you add a signal connection in your designer file?



  • Thank you Thomas for your reply. I didn't double click on button... Signals and Slots are assigned in the first Window, are they required in second window? Please explain...

    Yeah here is the ui_mainwindow.h file:

    @pushButton = new QPushButton(widget);
    pushButton->setObjectName(QString::fromUtf8("pushButton"));

        horizontalLayout->addWidget(pushButton);
    
        pushButton_2 = new QPushButton(widget);
        pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));
    
        horizontalLayout->addWidget(pushButton_2);
    
        MainWindow->setCentralWidget(centralWidget);
        mainToolBar = new QToolBar(MainWindow);
        mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
        MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);
    
        retranslateUi(MainWindow);
        QObject::connect(pushButton, SIGNAL(clicked()), MainWindow, SLOT(process()));
        QObject::connect(pushButton_2, SIGNAL(clicked()), MainWindow, SLOT(close()));
    
        QMetaObject::connectSlotsByName(MainWindow);@


  • Ah, that explains it :)

    Your ui_mainwindow.h file has a connect, which means you added it in the QtDesigner.
    You again have the same connect in void MainWindow::setSignals(), which I guess you typed manually.
    So with two connects, you get two calls to process()

    Remove one set of connects to solve this :)



  • :) Yeah you are absolutely right.... thanks a lot...


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.