0

我一直在努力解决在 Windows 下在 Qt 中初始化多个表单的问题(版本是 5.0.1,但我认为这并不重要)。长话短说,我的应用程序包含 2 个表单,其中一个应该在单击另一个表单上的按钮时被调用。
代码运行如下:
1)main.cpp:

#include "main.h"
#include <QApplication>
FmNewWord fmNewWord;
MainWindow w;
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    w.show();

    return a.exec();
}

2)main.h:

#ifndef MAIN_H
#define MAIN_H
#include "mainwindow.h"
#include "fmnewword.h"
extern FmNewWord fmNewWord;
extern MainWindow w;
#endif // MAIN_H

3)主窗口.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "ui_mainwindow.h"


class MainWindow : public QMainWindow, private Ui::MainWindow
    {
    Q_OBJECT
signals:
    void sgnl_new_word();
public:
    explicit MainWindow(QWidget *parent = 0);

protected:
    void changeEvent(QEvent *e);
private slots:
    void on_commandLinkButton_clicked();
    void on_miExit_triggered();
    void on_miNewWord_triggered();
    };

#endif // MAINWINDOW_H

4)主窗口.cpp:

#include "main.h"
#include <Windows.h>
extern FmNewWord fmNewWord;
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    setupUi(this);
}

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

void MainWindow::on_commandLinkButton_clicked()
{
    MessageBox(0, 0, 0, 0);
}

void MainWindow::on_miExit_triggered()
{
    this->close();
}

void MainWindow::on_miNewWord_triggered()
{
    fmNewWord.show();
}

5) fmnewword.cpp:

#include "fmnewword.h"

FmNewWord::FmNewWord(QWidget *parent) :
    QMainWindow(parent)
{
    setupUi(this); /// here the app crashes with parent == NULL
}
void FmNewWord::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        retranslateUi(this);
        break;
    default:
        break;
    }
}

6) fmnewword.h:

#ifndef FMNEWWORD_H
#define FMNEWWORD_H

#include "ui_fmnewword.h"

class FmNewWord : public QMainWindow, private Ui::FmNewWord
    {
    Q_OBJECT

public:
    explicit FmNewWord(QWidget *parent = 0);

protected:
    void changeEvent(QEvent *e);
    };
#endif // FMNEWWORD_H

代码在 fmnewword.cpp 中显示的行中的初始化期间不断崩溃。有人能指出原因吗?谢谢。

4

1 回答 1

0

首先,QApplication必须在创建任何小部件之前。您的代码应如下所示:

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

    return a.exec();
}

这就是必须创建第二种形式的方式:

class FmNewWord;

class MainWindow : public QMainWindow, private Ui::MainWindow
{
    Q_OBJECT
    ...
private slots:
    void on_miNewWord_triggered();

private:
    FmNewWord *fmNewWord;
};

void MainWindow::on_miNewWord_triggered()
{
    fmNewWord = new FmNewWord;
    fmNewWord->show();
}
于 2013-03-20T06:55:58.527 回答