Qt中的父窗口和子窗口通信 - 子窗口打开两次

时间:2013-02-12 05:44:10

标签: qt qt-creator

我有两个窗户,一个父母和一个孩子。在父窗口中,我有一个Next按钮,onClick()' ed打开了子窗口,但在我的情况下,两个子窗口正在打开,我在做什么错误!?

以下是我的代码:

.h文件

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文件

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();
}

1 个答案:

答案 0 :(得分:2)

我解决了,问题出在这里:

在设计器头文件中,即在ui_mainwindow.h中,我有:

QObject::connect(pushButton, SIGNAL(clicked()), MainWindow, SLOT(process())); QObject::connect(pushButton_2, SIGNAL(clicked()), MainWindow, SLOT(close()));

并在源文件中,即setSignals()中的mainwindow.cpp,我再次声明:

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

因此,对于两个连接,我们得到两个process()的调用,我们必须评论任何人只显示一个子窗口。就是这样: - )