C++ Qt-打开窗口的单个实例

C++ Qt-打开窗口的单个实例,c++,qt,C++,Qt,如何检查窗口/对话框是否已打开?我用这段代码打开了一个新的对话框,但每次我点击它,对话框就会一直打开。显然不是“设置”对话框的工作方式 Class *someClass = new Class(); someclass->show(); 在代码中,每次都创建一个新窗口/小部件/对话框。 在其他地方初始化某个类,然后只显示它 class Foo { public: Foo() { someClass = new SomeClass() } void fooClicked()

如何检查窗口/对话框是否已打开?我用这段代码打开了一个新的对话框,但每次我点击它,对话框就会一直打开。显然不是“设置”对话框的工作方式

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

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

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

private:
    SomeClass *someClass;
};

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

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

private:
    SomeClass *someClass;
};
使用QPointer:

QPointer<MyDialog> dialog = new MyDialog(this);
dialog->show();
...
if (dialog) dialog->show();
QPointer dialog=new MyDialog(此);
对话框->显示();
...
如果(对话框)对话框->显示();
如果对话框存在,将显示该对话框。如果同时将其删除,它将保留0而不是无效地址,并且最后一行将永远不会执行-它不会显示,但您可以根据需要重新创建它。

使用QPointer:

QPointer<MyDialog> dialog = new MyDialog(this);
dialog->show();
...
if (dialog) dialog->show();
QPointer dialog=new MyDialog(此);
对话框->显示();
...
如果(对话框)对话框->显示();

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

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

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

  ...
}
无论何时创建新实例,都可以设置
instance
。当实例为空时,可以创建一个新窗口。当您想要关闭打开的窗口时,应该再次将实例设为null。这允许您只有一个打开的窗口

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

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

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

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

  ...
}
无论何时创建新实例,都可以设置
instance
。当实例为空时,可以创建一个新窗口。当您想要关闭打开的窗口时,应该再次将实例设为null。这允许您只有一个打开的窗口

if (MyWindow::instance == NULL) {
  MyWindow *w = new MyWindow(...);
  MyWindow::instance = w;
}
这种设计模式称为Singleton,它允许每个类只有一个对象。另外,这有点不同,因为在Singleton中,构造函数不是公共的,应该使用factory方法生成对象,但它是类似的。

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

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.
在调用类(或主应用程序类,或类似类)中定义指向该类的指针:

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.

在我看来,它既不优雅也不灵活。当creating类中的一个(非静态)成员变量同样有效时,为什么要将某个对象设置为单例呢?如果您想拥有一个对话框的多个实例(但不一定在给定的上下文中),那么该成员也可以工作。是这样的。此实现不会强制您只有一个对象。此外,静态指针可以在类之外。但我同意你的看法。当局部变量足够时不应该使用静态变量。在我看来,静态变量既不优雅也不灵活。当creating类中的一个(非静态)成员变量同样有效时,为什么要将某个对象设置为单例呢?如果您想拥有一个对话框的多个实例(但不一定在给定的上下文中),那么该成员也可以工作。是这样的。此实现不会强制您只有一个对象。此外,静态指针可以在类之外。但我同意你的看法。当局部变量足够时,不应该使用静态变量。我同意这种方法。将someClass初始化为0,并仅在需要时创建它。如果someClass不为null,则可能需要在fooClicked()中调用raise()。如果我使用以下代码,它会给我带来大量错误:向我们显示这些错误会很有帮助。。。但是您可能已经在
MainWindow.cpp
中有了
MainWindow::MainWindow(QWidget*)
。另外,什么是
设置
?我同意这种方法。将someClass初始化为0,并仅在需要时创建它。如果someClass不为null,则可能需要在fooClicked()中调用raise()。如果我使用以下代码,它会给我带来大量错误:向我们显示这些错误会很有帮助。。。但是您可能已经在
MainWindow.cpp
中有了
MainWindow::MainWindow(QWidget*)
。另外,什么是
设置