2013-08-03 4 views
2

J'ai un bouton, quand il est cliqué sur une nouvelle fenêtre afficher avec un QLineEdit, et un QLabel dessus, ma connexion entre le bouton et la fonction fonctionne bien, mais la nouvelle fenêtre ne fonctionne pas montrer.Nouvelle fenêtre ne montre pas

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(); 

} 

Répondre

2

Vous devez créer des variables d'étiquette de classe pour la nouvelle fenêtre et les choses que vous voulez mettre, de créer les objets eux-mêmes avec le mot-clé new dans la fonction, parce que si vous créez tout cela simplement dans une fonction, ils seront créés dans la pile, et vous devriez savoir qu'après qu'une fonction retourne/finit, la pile de cette fonction est supprimée (avec votre nouvelle fenêtre et le truc dessus aussi).

Inclure les en-têtes pour les classes que vous souhaitez utiliser dans votre fichier d'en-tête de WINDOWMANAGER:

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

ajouter ensuite les variables de balise à la partie privée:

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

En cas un clic sur le bouton SET les variables de tag, et créer la configuration de l'interface utilisateur:

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(); 
} 

De même, n'oubliez pas que vous devrait utiliser -> au lieu de . pour appeler des fonctions ici, car ces variables sont des pointeurs. Aussi, c'est la raison pour laquelle vous n'avez pas besoin d'utiliser l'opérateur & pour obtenir leur adresse. Notez également que vous devez supprimer ces objets, car C++ ne les supprime pas automatiquement pour vous. Vous devriez delete tout ce que vous new. Un bon endroit pour faire ceci est dans le destructeur dans votre classe windowManager. Vérifiez simplement si les variables de variable ne sont pas NULL (s'il existe un objet) avant d'essayer de les supprimer, sinon des erreurs peuvent se produire.

Une meilleure solution consiste à passer un pointeur parent en tant que paramètre du constructeur, de cette façon Qt les supprimera à leur fermeture, car si le parent est détruit, les enfants seront également détruits.
En outre, vous n'avez pas besoin de définir manuellement où vont les objets, car Qt le fera maintenant dans la hiérarchie (dans certains cas).

Dans ce cas, la fonction d'événement de clic de votre bouton ressemblerait à ceci:

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

Vous créez l'objet fenêtre QWidget sur la pile. Par conséquent, cet objet sera supprimé lorsque l'appel à la fonction addQuestionDialog se termine. Changez le code pour créer le nouveau widget de fenêtre en utilisant "nouveau", et arrangez-le pour qu'il soit supprimé après sa fermeture. Certaines solutions possibles sont présentées ici:

destructors in Qt4

+0

J'ai changé les lignes: QWidget * = new window QWidget (et parents); et window-> setAttribute (Qt :: WA_DeleteOnClose); mais ça ne se voit toujours pas. – erbal