0

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

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

4 回答 4

1

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

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.
于 2012-09-16T13:08:04.117 回答
1

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

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

private:
    SomeClass *someClass;
};
于 2012-09-16T09:56:54.857 回答
1

使用 QPointer:

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

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

于 2012-09-16T10:11:25.963 回答
0

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

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

  ...
}

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

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

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

于 2012-09-16T10:11:54.570 回答