将QDialog窗口限制为一个实例[Qt]?

时间:2016-02-04 04:29:58

标签: c++ qt

我有一个Qt GUI应用程序,当我转到帮助>时会打开一个对话框关于。但是,如果我去帮助>再一次,弹出另一个对话框。我试图得到它,以便已经打开的关于对话框是唯一可以打开的对话框(即不允许其他关于对话框)。我觉得这应该很简单,但我不断收到分段错误。这是我的代码:

myApp.h

#ifndef MYAPP_H
#define MYAPP_H

#include <QMainWindow>
#include "about.h"

namespace Ui {
class MyApp;
}

class MyApp : public QMainWindow // inherit all public parts of QMainWindow
{
  Q_OBJECT

public:
  explicit MyApp(QWidget* parent = 0);
  ~MyApp();

private slots:
  void on_actionAbout_triggered();

private:
  Ui::MyApp* ui;
  About* aboutDialog;
};

#endif // MYAPP_H

MyApp.cpp中

#include "MyApp.h"
#include "ui_MyApp.h"
#include "about.h"

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

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

void MyApp::on_actionAbout_triggered()
{
  if (!aboutDialog) {
    aboutDialog = new About(this);  // create new window
  }
  aboutDialog->show();
  aboutDialog->activateWindow();
}

about.h

#ifndef ABOUT_H
#define ABOUT_H

#include <QDialog>

namespace Ui {
class About;
}

class About : public QDialog
{
  Q_OBJECT

public:
  explicit About(QWidget* parent = 0);
  ~About();

private:
  Ui::About* ui;
};

#endif // ABOUT_H

about.cpp

#include "about.h"
#include "ui_about.h"

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

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

MyApp.cpp中,当我摆脱if时,它会起作用。但是点击“帮助”&gt;关于(actionAbout_triggered)多次将打开一堆关于窗口。我只想要1.所以我想我会输入一个if语句,如果About对话框已经打开,请不要再创建另一个,而只是将其设置为活动窗口。我遇到了分段错误。我知道这意味着它试图访问不应该存在的内存,但我不知道为什么。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

执行此操作的常规方法是为“关于”窗口设置模式对话框。像这样的东西

void MyApp::on_actionAbout_triggered()
{
    About dlg(this);
    dlg.exec();
}

特别针对您的问题,问题是您没有将aboutDialog初始化为MyApp构造函数中的任何内容,因此它是“未定义的值” - 可能不是null

aboutDialog构造函数中将MyApp设置为null以解决您的段错误。