2012-09-16 6 views
0

창/대화 상자가 이미 열려 있는지 확인하려면 어떻게합니까? 이 코드를 사용하여 새 대화 상자를 열었지만 클릭 할 때마다 대화 상자가 열립니다. 분명히 설정 대화 상자가 작동하는 방식이 아닙니다.Qt - 단일 인스턴스 열기

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

답변

1

코드에서 당신은 매번 새로운 창/위젯/대화 상자를 생성합니다. 다른 곳의 *someClass을 초기화하고 표시하십시오.

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

private: 
    SomeClass *someClass; 
}; 
+0

을 oach. someClass를 0으로 초기화하고 필요할 때만 생성합니다. someClass가 null이 아닌 경우에 대비하여 fooClicked()에서 raise()를 호출 할 수 있습니다. –

+0

이 코드를 사용하면 오류가 발생합니다 : https://dl.dropbox.com/u/11701729/Code.txt – Fahmid

+0

오류가 발생하면 도움이 될 것입니다.하지만 이미 'MainWindow :: MainWindow (QWidget *)'를'mainwindow.cpp'에 추가합니다. 또한 '설정'이란 무엇입니까? – lukad

1

사용 QPointer :

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

대화 상자가 표시됩니다 존재합니다. 그 동안 삭제 된 경우 잘못된 주소 대신 0이 유지되고 마지막 행은 절대 실행되지 않습니다. 표시되지는 않지만 필요할 경우 다시 작성할 수 있습니다.

0

윈도우 클래스에 정적 포인터를 만들 수 있습니다. 마지막으로 열린 창 개체를 저장할 수 있습니다.

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

    ... 
} 

새 인스턴스를 만들 때마다 instance을 설정할 수 있습니다. 인스턴스가 null이면 새 창을 만들 수 있습니다. 열린 창을 닫으려면 인스턴스를 다시 null로 설정해야합니다. 이렇게하면 열려있는 창을 하나만 가질 수 있습니다.

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

이 디자인 패턴을 싱글 톤이라고하며, 클래스 당 하나의 객체 만 가질 수 있습니다. 또한, Singleton에서는 생성자가 public이 아니므로 factory 메소드가 객체를 만드는 데 사용해야하지만 유사합니다. 에서

+0

나에게 매우 우아하거나 유연하지 않습니다. 생성 클래스의 (비 정적) 멤버 변수가 올바르게 작동 할 때 왜 무언가를 싱글 톤으로 만드나요? 대화 상자의 인스턴스를 두 번 이상 사용하려는 경우에도 멤버가 작동합니다 (주어진 컨텍스트에서는 필수 항목이 아닐 수도 있습니다). –

+0

나는 그것이 싱글 톤이 아니라고 말했다. 그것은 그런 것입니다. 이 구현은 오직 하나의 객체만을 갖도록 강요하지 않습니다. 또한 정적 포인터는 클래스 외부에있을 수 있습니다. 하지만 나는 너와 동의한다. 지역 변수가 충분할 때 정적 변수를 사용해서는 안됩니다. –

1

부르심 클래스 (또는 기본 응용 프로그램 클래스, 또는 무언가 유사) 클래스에 대한 포인터 정의, 그 메인 클래스의 생성자에서

dialogclass *someclass; 

을 대화 클래스 초기화 :

someclass = NULL; 

당신이 대화 상자를 표시하려면이 라인을 따라 뭔가 할 :이 appr에 동의

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.