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

Restrict QDialog window to one instance [Qt]?

本文关键字:一个 实例 Qt 窗口 QDialog      更新时间:2023-10-16

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

我的应用程式

#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

我的应用.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();
}

关于.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

关于.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时,它起作用了。但是多次单击"帮助">"关于"(actionAbout_triggered(将打开一堆"关于"窗口。我只想要 1。所以我想我会放一个 if 语句,说如果"关于"对话框已经打开,请不要创建另一个对话框,而只是将其设置为活动窗口。我遇到了分段错误。我知道这意味着它试图在不应该访问的地方访问内存,但我不知道为什么。

任何帮助将不胜感激。

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

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

具体到您的问题,问题是您没有将aboutDialog初始化为 MyApp 构造函数中的任何内容,因此它是"未定义的值" - 可能不是null

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