2015-09-26 109 views
0

我的Qt代碼有問題。我想編寫一個正在獲取點座標的程序,然後該點正在繪製座標點。我的程序在創建時沒有任何錯誤或警告,但在開始時崩潰(MainWindow不顯示)。這是我的代碼:QT使用接受的信號連接崩潰

的main.cpp

#include <QApplication> 

#include "mainwindow.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    MainWindow win; 
    win.show(); 

    return app.exec(); 
} 

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QWidget> 
#include <QAction> 
#include <QToolBar> 
#include <QTextCodec> 
#include <QObject> 
#include <QDialog> 
#include <QLineEdit> 
#include <QPushButton> 
#include <QString> 

#include "addpoint.h" 

class MainWindow: public QMainWindow 
{ 
    Q_OBJECT 
private: 
    QToolBar *AddToolbar; 
    QAction *AddPointAction; 

    AddPoint *AddPointDialog; 



    QLineEdit *x; 


public: 
    MainWindow(); 

    void createToolbar(); 
    void createActionAdd(); 

signals: 

public slots: 
    void PointClicked(); 
    void DialogAccepted(); 
}; 

#endif // MAINWINDOW_H 

mainwindow.cpp

#include "mainwindow.h" 

MainWindow::MainWindow() 
{ 
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); 

    createActionAdd(); 
    createToolbar(); 

    connect(AddPointAction, SIGNAL(triggered(bool)), this, SLOT(PointClicked())); 

    connect(AddPointDialog, SIGNAL(accepted()), this, SLOT(DialogAccepted())); 

    setMinimumSize(480, 320); 
} 

/**/ 
void MainWindow::createToolbar() 
{ 
    AddToolbar = new QToolBar; 
    AddToolbar->addAction(AddPointAction); 

    addToolBar(AddToolbar); 
} 

/**/ 
void MainWindow::createActionAdd() 
{ 
    AddPointAction = new QAction("Add Road", this); 

    x = new QLineEdit(this); 
    x->setFixedSize(100, 30); 
    x->move(100, 100); 
} 

/**/ 
void MainWindow::PointClicked() 
{ 
    AddPointDialog = new AddPoint(this); 
    AddPointDialog->setModal(true); 

    AddPointDialog->exec(); 
} 

/**/ 
void MainWindow::DialogAccepted() 
{ 
    x->setText("abc"); 
} 

addpoint.h

#ifndef ADDPOINT_H 
#define ADDPOINT_H 

#include <QWidget> 
#include <QTextCodec> 
#include <QDialog> 
#include <QObject> 
#include <QLabel> 
#include <QLineEdit> 
#include <QPushButton> 
#include <QString> 

class AddPoint : public QDialog 
{ 
    Q_OBJECT 
private: 
    QLabel *XpointL; 
    QLineEdit *XPoint; 
    QPushButton *OKButton; 


public: 
    AddPoint(QWidget *parent); 
    void createButton(); 

signals: 

public slots: 
}; 

#endif // ADDPOINT_H 

addpoint.cpp

#include "addpoint.h" 

AddPoint::AddPoint(QWidget *parent) :QDialog(parent) 
{ 
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); 

    createButton(); 

    connect(OKButton, SIGNAL(clicked(bool)), this, SLOT(accept())); 

    setMinimumSize(320, 240); 
} 

/**/ 
void AddPoint::createButton() 
{ 
    XpointL = new QLabel("Point X:", this); 
    XpointL->setFixedSize(100, 30); 
    XpointL->move(10, 10); 

    XPoint = new QLineEdit(this); 
    XPoint->setFixedSize(180, 30); 
    XPoint->move(120, 10); 

    OKButton = new QPushButton("OK", this); 
    OKButton->setFixedSize(100, 30); 
    OKButton->move(200, 150); 

} 

運行的程序我aplication輸出一圈後看到: 「程序已意外結束了。」 「C:\ QT \打造-XXX-Desktop_Qt_5_4_2_MSVC2013_64bit-調試\調試\ xx.exe嘩啦啦」

我注意到,我做了一些實驗,這個代碼,我看到了,我有)在主窗口accpeted信號(問題的.cpp。我不知道我該怎麼處理這個問題。我希望你能幫助我。

回答

0

AddPointDialog是未初始化的指針,它尚未指向MainWindow的構造函數中的有效AddPoint。你不能打電話給connect。它的價值將在以後改變,當你做AddPointDialog = new AddPoint(this);,只有那時你可以撥打connect

簡單地說,在初始化指針後,您應該將connect調用移動到void MainWindow::PointClicked()。我也會讓該函數在本地運行,並將其存儲在堆棧中(您不會在其他任何地方使用它,並且您正在泄漏內存)。

的代碼將是:

void MainWindow::PointClicked() 
{ 
    AddPoint AddPointDialog(this); 
    AddPointDialog.setModal(true); 
    connect(&AddPointDialog, SIGNAL(accepted()), this, SLOT(DialogAccepted())); 
    AddPointDialog.exec(); 
}