2016-10-25 9 views
1

Qt Designerで2つのウィンドウを作成しましたが、最初のウィンドウでボタン "..."を使用して2番目のウィンドウを適切に開きたいとします。私はこれをやろうとしたが、助けてくれてありがとう。QWidgetを開くためのQPushButton

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'のインスタンスをnewで作成し、ポインタをどこかに格納するか、または第2のウィンドウがダイアログであり、短時間だけ存在する場合は' 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

関連する問題