如何检查窗口/对话框是否已打开?我使用此代码打开一个新对话框,但每次单击它时对话框都会保持打开状态。显然不是设置对话框的工作方式。
Class *someClass = new Class();
someclass->show();
答案 0 :(得分:1)
在您的代码中,您每次都会创建一个新窗口/窗口小部件/对话框。
在其他地方初始化*someClass
,然后只显示它。
class Foo
{
public:
Foo() { someClass = new SomeClass() }
void fooClicked() { someClass->show() }
private:
SomeClass *someClass;
};
答案 1 :(得分:1)
使用QPointer:
QPointer<MyDialog> dialog = new MyDialog(this);
dialog->show();
...
if (dialog) dialog->show();
如果存在对话框,则会显示。如果它在此期间被删除,它将保持0而不是无效的地址,并且最后一行将永远不会被执行 - 它将不会显示,但您可以根据需要重新创建它。
答案 2 :(得分: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.
答案 3 :(得分:0)
您可以在窗口类上创建一个静态指针。它允许您存储最后打开的窗口对象。
class MyWindow : public QWidget {
public :
static MyWindow* instance;
...
}
每当您创建新实例时,您都可以设置instance
。当实例为null时,您可以创建一个新窗口。如果要关闭打开的窗口,则应该再次使实例为null。这允许您只有一个打开的窗口。
if (MyWindow::instance == NULL) {
MyWindow *w = new MyWindow(...);
MyWindow::instance = w;
}
此设计模式称为Singleton,它允许您每个类只有一个对象。此外,这有点不同,因为在Singleton中,构造函数不是公共的,工厂方法应该用于制作对象,但它是相似的。