Qt - 打开一个窗口的单个实例

Posted

技术标签:

【中文标题】Qt - 打开一个窗口的单个实例【英文标题】:Qt - Open single instance of a window 【发布时间】:2012-09-16 09:49:16 【问题描述】:

如何检查窗口/对话框是否已打开?我使用此代码打开了一个新对话框,但每次单击它时,对话框都会继续打开。显然不是设置对话框的工作方式。

Class *someClass = new Class();
someclass->show();

【问题讨论】:

【参考方案1】:

在您的代码中,您每次都创建一个新窗口/小部件/对话框。 在其他地方初始化*someClass,然后只显示它。

class Foo

public:
    Foo()  someClass = new SomeClass() 
    void fooClicked()  someClass->show() 

private:
    SomeClass *someClass;
;

【讨论】:

我同意这种做法。虽然会将 someClass 初始化为 0 并仅在需要时创建它。如果 someClass 不为空,可能想在 fooClicked() 中调用 raise()。 如果我使用此代码,它会给我很多错误:dl.dropbox.com/u/11701729/Code.txt 向我们展示这些错误会很有帮助...但是您可能已经在mainwindow.cpp 中拥有MainWindow::MainWindow(QWidget*)。另外,Settings 是什么?【参考方案2】:

在您的调用类(或主应用程序类,或类似的东西)中定义一个指向该类的指针:

dialogclass *someclass;

在那个主类的构造函数中,初始化对话框类:

someclass = NULL;

当您想要显示对话框时,请按照以下方式进行操作:

if (!someclass) someclass = new dialogclass();  // Creates a dialog instance if it does not already exist 
if (!someclass->isVisible()) someclass->show(); // Only shows the dialog if it is not already shown.

【讨论】:

【参考方案3】:

使用 QPointer:

QPointer<MyDialog> dialog = new MyDialog(this);
dialog->show();
...
if (dialog) dialog->show();

如果对话框存在,它将被显示。如果在此期间被删除,它将保存 0 而不是无效地址,并且永远不会执行最后一行 - 它不会显示,但您可以根据需要重新创建它。

【讨论】:

【参考方案4】:

您可以在窗口类上创建一个静态指针。它允许您存储上次打开的窗口对象。

class MyWindow : public QWidget 
  public :
    static MyWindow* instance;

  ...

每当您创建一个新实例时,您都可以设置instance。当实例为空时,您可以创建一个新窗口。当你想关闭打开的窗口时,你应该再次使实例为空。这允许您只打开一个窗口。

if (MyWindow::instance == NULL) 
  MyWindow *w = new MyWindow(...);
  MyWindow::instance = w;

这种设计模式称为 Singleton,它允许每个类只有一个对象。另外,这有点不同,因为在 Singleton 中,构造函数不是公共的,并且应该使用工厂方法来创建对象,但它是相似的。

【讨论】:

对我来说似乎不是很优雅也不是很灵活。当创建类中的(非静态)成员变量工作得一样好时,为什么要使某些东西成为单例?如果您想拥有多个对话框实例(但不一定在给定的上下文中),该成员也可以工作。 正如我所说,它不是单例。就是这样。此实现不会强迫您只有一个对象。此外,静态指针可以在类之外。但我同意你的看法。当局部变量足够时,不应使用静态变量。

以上是关于Qt - 打开一个窗口的单个实例的主要内容,如果未能解决你的问题,请参考以下文章

单个实例[Windows必须在处理单个实例时重新打开...]

如何在 Visual Studio 2017 的单个表单上打开多个 OpenGL 窗口?

QT/QML 从主窗口重新打开新窗口

Qt启动另一个窗口

按下按钮时获取 PyQt4 以打开另一个 Qt 窗口

Qt的问题如何打开它们之间调用的2个窗口