2013-08-03 16 views
2

QLineEdit과 QLabel이있는 새 창을 클릭하면 단추와 함수 사이의 연결이 잘되지만 새 창이 표시되지 않습니다. 보여 주다.새 창이 표시되지 않습니다.

void windowManager::addQuestionDialog(){ 
    QWidget window(&parent); 
    QLineEdit question; 
    QLabel label; 
    QVBoxLayout layout; 

    layout.addWidget(&question); 
    layout.addWidget(&label); 
    window.setLayout(&layout); 
    window.resize(200,200); 
    window.setWindowTitle(QObject::trUtf8("Kérdés bevitele...")); 
    window.show(); 

} 

답변

2

, 왜냐하면 만약 당신이 이들을 단순히 함수 안에서 만들면, 스택에서 생성되는 것보다 훨씬 더 간단하고, 함수가 리턴하거나 끝난 후에 그 함수에 대한 스택이 삭제된다는 것을 알아야하기 때문이다.).

#include <QDialog> 
#include <QLineEdit> 
#include <QLabel> 
#include <QVBoxLayout> 

그런 다음 민간 부분에 태그 변수를 추가 :

private: 
    QDialog *window; 
    QLineEdit *question; 
    QLabel *label; 
    QVBoxLayout *layout; 

을하여 버튼의 클릭 이벤트 세트에서

당신이 당신의 창 관리자 헤더 파일에 사용하려는 클래스의 헤더를 포함 태그 변수를 만들고 UI 설정을 만듭니다.

void windowManager::addQuestionDialog() 
{ 
    window = new QDialog(); 
    question = new QLineEdit(); 
    label = new QLabel(); 
    layout = new QVBoxLayout(); 
    layout->addWidget(question); 
    layout->addWidget(label); 
    window->setLayout(layout); 
    window->resize(200,200); 
    window->setWindowTitle(QObject::trUtf8("Kérdés bevitele...")); 
    window->show(); 
} 

또한 잊지 마세요. 이 태그 변수는 포인터이므로 여기에서 호출 함수의 경우 . 대신 ->을 사용해야합니다. 또한 주소를 얻기 위해 & 연산자를 사용할 필요가없는 이유이기도합니다.

또한 C++이 자동으로 이러한 개체를 삭제하지 않기 때문에 이러한 개체를 삭제해야합니다. 너 delete 모두 new해야합니다. 이 작업을 수행하기에 좋은 곳은 windowManager 클래스의 소멸자입니다. 태그 변수를 삭제하기 전에 태그 변수가 NULL (객체가있는 경우)이 아닌지 확인하십시오. 그렇지 않으면 오류가 발생할 수 있습니다.

부모 포인터를 생성자의 매개 변수로 전달하는 것이 더 나은 해결책입니다. 따라서 부모가 소멸되면 자식도 삭제되므로 Qt는 부모 포인터를 생성자의 매개 변수로 전달합니다.
Qt가 이제는 계층 구조에서 나오기 때문에 (일부의 경우) 오브젝트를 어디에서 수동으로 설정할 필요가 없습니다. 이 경우

하여 버튼의 클릭 이벤트 함수가 다음과 같을 것이다 : 나는 라인을 변경했습니다

void windowManager::addQuestionDialog() 
{ 
    window = new QDialog(this); 
    question = new QLineEdit(window); 
    label = new QLabel(window); 
    layout = new QVBoxLayout(window); 
    //The following two lines are optional, but if you don't add them, the dialog will look different. 
    layout->addWidget(question); 
    layout->addWidget(label); 
    window->resize(200,200); 
    window->setWindowTitle(QObject::trUtf8("Kérdés bevitele...")); 
    window->show(); 
} 
0

스택에 창 QWidget 개체를 만듭니다. 따라서이 객체는 addQuestionDialog 함수 호출이 완료되면 삭제됩니다. "new"를 사용하여 새 창 위젯을 만들 코드를 변경하고 닫은 후에 삭제하도록 정렬하십시오. 몇 가지 가능한 솔루션은 여기에 제시되어 있습니다

당신은 새로운 창을 당신이 함수에서 new 키워드로 객체 자신을 만드는 것보다, 그것으로 넣을 물건 클래스 태그 변수를 만들 필요가 destructors in Qt4

+0

:는 QWidget * 창 = 새로운는 QWidget (부모); 및 window-> setAttribute (Qt :: WA_DeleteOnClose); 그러나 여전히 보여지지 않습니다. – erbal