ウィンドウ/ダイアログが既に開いているかどうかを確認するにはどうすればよいですか? このコードを使用して新しいダイアログ ボックスを開きましたが、クリックするたびにダイアログが開き続けます。明らかに、設定ダイアログが機能する方法ではありません。
Class *someClass = new Class();
someclass->show();
QPointerを使用します。
QPointer<MyDialog> dialog = new MyDialog(this);
dialog->show();
...
if (dialog) dialog->show();
ダイアログが存在する場合は表示されます。その間に削除された場合、無効なアドレスの代わりに0が保持され、最後の行が実行されることはありません。表示されませんが、必要に応じて再作成できます。
呼び出しクラス (またはメイン アプリケーション クラスなど) で、クラスへのポインターを定義します。
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.
コードでは、毎回新しいウィンドウ/ウィジェット/ダイアログを作成します。他の場所で初期化*someClass
してから、それを表示するだけです。
class Foo
{
public:
Foo() { someClass = new SomeClass() }
void fooClicked() { someClass->show() }
private:
SomeClass *someClass;
};
ウィンドウクラスに静的ポインタを作成できます。最後に開いたウィンドウオブジェクトを保存できます。
class MyWindow : public QWidget {
public :
static MyWindow* instance;
...
}
新しいインスタンスを作成するときはいつでも、を設定できますinstance
。インスタンスがnullの場合、新しいウィンドウを作成できます。開いているウィンドウを閉じたい場合は、インスタンスを再度nullにする必要があります。これにより、開いているウィンドウを1つだけにすることができます。
if (MyWindow::instance == NULL) {
MyWindow *w = new MyWindow(...);
MyWindow::instance = w;
}
このデザインパターンはシングルトンと呼ばれ、クラスごとに1つのオブジェクトのみを持つことができます。また、シングルトンではコンストラクターがパブリックではなく、オブジェクトの作成にファクトリメソッドを使用する必要があるため、これは少し異なりますが、類似しています。