2016-10-25 15 views
1

Я создал 2 окна с Qt Designer, и я хочу в первом окне с кнопкой «...» правильно открыть второе окно. Я попытался это сделать, спасибо за помощь.QPushButton, чтобы открыть 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' является локальной переменной в обработчике, поэтому он разрушается немедленно, когда функция заканчивается. Либо создайте экземпляр «SecondWindow» с новым, либо сохраните указатель где-нибудь, либо используйте 'doModal()', если второе окно является диалогом и должно существовать только на короткое время. –

+0

@KarstenKoop, Возможно, вы можете написать код. Это будет пример в будущем. – Meugiwara

ответ

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

     window.show(); 
    } 

В тот момент, эта функция завершается, то SecondWindow объект будет закрыть немедленно. поскольку он создан только в стеке, который будет автоматически уничтожен, когда выходит за рамки.

, чтобы исправить это, вы должны передать его на кучу/стек в качестве элемента данных о классе FirstWindow или сделать его статическим

Выделяют до кучи и сделать его элемент данных:

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

или сделать его статическим:

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

или Выделяют стека и сделать его членом данные FirstWindow класс:

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

Благодарим вас за это. – Meugiwara

+0

@Meugiwara, если это решило вашу проблему, вы должны пометить ее как решаемую –

+0

У меня точно такая же ошибка: «SecondWindow не называет тип», но вы помогли мне правильно писать. – Meugiwara