창/대화 상자가 이미 열려 있는지 확인하려면 어떻게합니까? 이 코드를 사용하여 새 대화 상자를 열었지만 클릭 할 때마다 대화 상자가 열립니다. 분명히 설정 대화 상자가 작동하는 방식이 아닙니다.Qt - 단일 인스턴스 열기
Class *someClass = new Class();
someclass->show();
창/대화 상자가 이미 열려 있는지 확인하려면 어떻게합니까? 이 코드를 사용하여 새 대화 상자를 열었지만 클릭 할 때마다 대화 상자가 열립니다. 분명히 설정 대화 상자가 작동하는 방식이 아닙니다.Qt - 단일 인스턴스 열기
Class *someClass = new Class();
someclass->show();
코드에서 당신은 매번 새로운 창/위젯/대화 상자를 생성합니다. 다른 곳의 *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();
대화 상자가 표시됩니다 존재합니다. 그 동안 삭제 된 경우 잘못된 주소 대신 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 메소드가 객체를 만드는 데 사용해야하지만 유사합니다. 에서
나에게 매우 우아하거나 유연하지 않습니다. 생성 클래스의 (비 정적) 멤버 변수가 올바르게 작동 할 때 왜 무언가를 싱글 톤으로 만드나요? 대화 상자의 인스턴스를 두 번 이상 사용하려는 경우에도 멤버가 작동합니다 (주어진 컨텍스트에서는 필수 항목이 아닐 수도 있습니다). –
나는 그것이 싱글 톤이 아니라고 말했다. 그것은 그런 것입니다. 이 구현은 오직 하나의 객체만을 갖도록 강요하지 않습니다. 또한 정적 포인터는 클래스 외부에있을 수 있습니다. 하지만 나는 너와 동의한다. 지역 변수가 충분할 때 정적 변수를 사용해서는 안됩니다. –
부르심 클래스 (또는 기본 응용 프로그램 클래스, 또는 무언가 유사) 클래스에 대한 포인터 정의, 그 메인 클래스의 생성자에서
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.
을 oach. someClass를 0으로 초기화하고 필요할 때만 생성합니다. someClass가 null이 아닌 경우에 대비하여 fooClicked()에서 raise()를 호출 할 수 있습니다. –
이 코드를 사용하면 오류가 발생합니다 : https://dl.dropbox.com/u/11701729/Code.txt – Fahmid
오류가 발생하면 도움이 될 것입니다.하지만 이미 'MainWindow :: MainWindow (QWidget *)'를'mainwindow.cpp'에 추가합니다. 또한 '설정'이란 무엇입니까? – lukad