2015-09-26 34 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(); 
}