2016-10-25 1 views
1

J'ai créé 2 fenêtres avec Qt Designer et je veux dans la première fenêtre avec le bouton "..." ouvrir la deuxième fenêtre correctement. J'ai essayé de le faire, merci de votre aide.QPushButton pour ouvrir QWidget

firstwindow.cpp

#include "firstwindow.h" 
#include "ui_firstwindow.h" 
#include "secondwindow.h" 
#include "ui_secondwindow.h" 

FirstWindow::FirstWindow(QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::FirstWindow) 
{ 
    ui->setupUi(this); 
    ui->buttonapply->setText("Valider"); 
    ui->buttoncancel->setText("Annuler"); 
    ui->buttonetc->setText("..."); 
    ui->buttonnext->setIcon(QIcon(":/Images/Images/Haut.png")); 
    ui->buttonprevious->setIcon(QIcon(":/Images/Images/Bas.png")); 

    connect(ui->buttonetc, SIGNAL(clicked()), this, SLOT(ShowSecondWindow())); 
} 

FirstWindow::~FirstWindow() 
{ 
    delete ui; 
} 

void FirstWindow::ShowSecondWindow() 
{ 
    SecondWindow window; 

    window.show(); 
} 

firstwindow.h

#ifndef FIRSTWINDOW_H 
#define FIRSTWINDOW_H 

#include <QApplication> 
#include <QWidget> 
#include <QIcon> 
#include "secondwindow.h" 
#include "ui_secondwindow.h" 

namespace Ui { 
class FirstWindow; 
} 

class FirstWindow : public QWidget 
{ 
    Q_OBJECT 

public: 
    explicit FirstWindow(QWidget *parent = 0); 
    ~FirstWindow(); 

public slots: 
    void ShowSecondWindow(); 

private: 
    Ui::FirstWindow *ui; 
    SecondWindow *window; 
}; 

#endif // FIRSTWINDOW_H 

secondwindow.cpp

#include "firstwindow.h" 
#include "ui_firstwindow.h" 
#include "secondwindow.h" 
#include "ui_secondwindow.h" 

SecondWindow::SecondWindow(QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::SecondWindow) 
{ 
    ui->setupUi(this); 
} 

SecondWindow::~SecondWindow() 
{ 
    delete ui; 
} 

secondwindow.h

#ifndef SECONDWINDOW_H 
#define SECONDWINDOW_H 

#include <QWidget> 
#include "firstwindow.h" 
#include "ui_firstwindow.h" 

namespace Ui { 
class SecondWindow; 
} 

class SecondWindow : public QWidget 
{ 
    Q_OBJECT 

public: 
    explicit SecondWindow(QWidget *parent = 0); 
    ~SecondWindow(); 

private: 
    Ui::SecondWindow *ui; 
}; 

#endif // SECONDWINDOW_H 

main.cpp

#include "firstwindow.h" 
#include "ui_firstwindow.h" 
#include "secondwindow.h" 
#include "ui_secondwindow.h" 

int  main(int argc, char **argv) 
{ 
    QApplication program(argc, argv); 
    FirstWindow  window; 

    window.setWindowTitle("BASELFI - Programme - © 2016 H2A"); 
    window.setWindowIcon(QIcon(":/Images/Images/Bouclier.png")); 
    window.setFixedSize(340, 270); 
    window.show(); 
    return program.exec(); 
} 
+0

'window' est une variable locale dans votre gestionnaire, il est détruit immédiatement lorsque la fonction se termine. Créez une instance de 'SecondWindow' avec new et stockez le pointeur quelque part, ou utilisez' doModal() 'si la deuxième fenêtre est une boîte de dialogue et ne devrait exister que pendant une courte période. –

+0

@KarstenKoop, Peut-être pourriez-vous écrire du code. Ce sera un exemple à l'avenir. – Meugiwara

Répondre

2
void FirstWindow::ShowSecondWindow() 
    { 
     SecondWindow window; 

     window.show(); 
    } 

Le moment cette fonction se termine, l'objet SecondWindow fermera immédiatement. puisque c'est seulement créé sur la pile qui sera automatiquement détruit quand il sort de la portée.

pour résoudre ce problème, vous devez allouer sur le tas/pile en tant que membre de données sur votre classe FirstWindow ou le rendre statique

Allouer à tas et rendre membre de données:

class FirstWindow 
{ 
.... 
private: 
    SecondWindow* window; // you must delete this in destructor 
}; 
void FirstWindow::ShowSecondWindow() 
{ 
     window = new SecondWindow; 
     window->show(); 
} 

ou Faites statique:

void FirstWindow::ShowSecondWindow() 
{ 
     static SecondWindow window; 
     window.show(); 
} 

ou Allouer à empiler et à le rendre membre de données à FirstWindow classe:

class FirstWindow 
{ 
.... 
private: 
    SecondWindow window; // initialize in constructor 
}; 
void FirstWindow::ShowSecondWindow() 
{ 
     window.show(); 
} 
+0

Merci pour cela. – Meugiwara

+0

@Meugiwara si cela a résolu votre problème, vous devez le marquer comme résolu –

+0

J'ai exactement la même erreur "SecondWindow ne nomme pas un type", mais vous m'avez aidé à écrire correctement. – Meugiwara