2017-10-02 7 views
0

以下は、確認ウィンドウ(メインウィンドウの[送信]ボタンをクリックして開くウィンドウ)の定義です。 confirmwindow.hQtの[送信]ボタンを押すとアプリがクラッシュするのはなぜですか?

#ifndef CONFIRMWINDOW_H 
#define CONFIRMWINDOW_H 

#include <QDialog> 

namespace Ui { 
class ConfirmWindow; 
} 

class ConfirmWindow : public QDialog 
{ 
    Q_OBJECT 

public: 
    explicit ConfirmWindow(QWidget *parent = 0); 
    ConfirmWindow(QString name); 
    ~ConfirmWindow(); 

private: 
    Ui::ConfirmWindow *ui; 
}; 

#endif // CONFIRMWINDOW_H 

そして私はそれがすべて私がメッセージでアプリがクラッシュボタンを、提出押してもそれまでは行くのプログラムを実行するとconfirmwindow.cppに、私は次のように

#include "confirmwindow.h" 
#include "ui_confirmwindow.h" 

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

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

ConfirmWindow::ConfirmWindow(QString name) 
{ 
    ui->label_show_name->setText(name); 
} 

を定義しコンソールとしてThe program has unexpectedly finished.

mainwindow.cpp

void MainWindow::on_pushButton_submit_clicked() 
{ 
    ConfirmWindow confirm_window(ui->lineEdit_name->text()); 
    confirm_window.exec(); 
} 

私はconfirmwindow.cppファイルで間違った方法でコンストラクタを定義していると思います。

+0

あなたは[デバッガ]でそのコードをステップ実行しようとしたことがあり(https://stackoverflow.com/questions/25385173/what-is-a-debugger-and-how-can -it-help-me-diagnose-problems)? – litelite

+2

2つのコンストラクタがあり、そのうちの1つはQDialogのコンストラクタを呼び出しません。 uiを初期化しません。ダイアログを作成するときに使用しているチェックコンストラクタをチェックする方がいいです... – Xatyrian

答えて

0

このライン:

ConfirmWindow confirm_window(ui->lineEdit_name->text()); 

はコンストラクタConfirmWindow(String)を使用してConfirmWindowを作成します。しかし、このコンストラクタではConfirmWindow::uiを初期化しないので、結果はui->label_show_nameに未定義の動作があります。

クイックフィックス:ここ

ConfirmWindow::ConfirmWindow(QString name) : 
    ui(new Ui::ConfirmWindow) // initialize UI 
{ 
    ui->label_show_name->setText(name); 
} 

いくつかのより多くの修正がされています

#ifndef CONFIRMWINDOW_H 
#define CONFIRMWINDOW_H 

#include <QDialog> 

namespace Ui { 
class ConfirmWindow; 
} 

class ConfirmWindow : public QDialog 
{ 
    Q_OBJECT 

public: 
    explicit ConfirmWindow(QWidget *parent = 0); 
    explicit ConfirmWindow(QString name, QWidget *parent = 0); // Prevent implicit conversion from QString 
    ~ConfirmWindow(); 

private: 
    Ui::ConfirmWindow *ui = nullptr; // Require C++11, but will make easier to debug cases where you forgot to initialize ui 
}; 

#endif // CONFIRMWINDOW_H 

-

#include "confirmwindow.h" 
#include "ui_confirmwindow.h" 

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

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

ConfirmWindow::ConfirmWindow(QString name, QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::ConfirmWindow) 
{ 
    ui->label_show_name->setText(name); 
} 
関連する問題