2015-09-26 2 views
0

У меня проблема с кодом Qt. Я хотел написать программу, которая принимает координаты точки, а затем эта точка рисует точку с этими координатами. Моя программа не имеет никаких ошибок или предупреждений, когда я ее построил, но она сбой при запуске (MainWindow не показывает). Это мой код:QT connect crash с использованием принятого сигнала

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); 

} 

После запуска программы я вижу в выходном круге: ПРИМЕНЕНИЕ «Программа неожиданно завершена.» «C: \ QT \ строить-ххх-Desktop_Qt_5_4_2_MSVC2013_64bit-Debug \ Debug \ xx.exe разбился»

Хочу отметить, что я сделал некоторые эксперименты с этим кодом и я увидел, что у меня есть проблемы с сигналом ACCPETED() в главном окне .cpp. Я не знаю, что я могу сделать с этой проблемой. Надеюсь, ты поможешь мне.

ответ

0

AddPointDialog - неинициализированный указатель, он еще не указывает на действительный AddPoint в конструкторе MainWindow. Вы не можете позвонить connect. Его значение изменится позже, когда вы сделаете AddPointDialog = new AddPoint(this);, и только после этого вы сможете позвонить connect.

Просто вы должны переместить свой connect звонок в void MainWindow::PointClicked() после того, как вы инициализировали свой указатель. Я также сделал бы AddPointDialog локальной функцией этой функции и сохранил ее в стеке (вы не используете ее нигде, и вы пропускаете память).

Код будет:

void MainWindow::PointClicked() 
{ 
    AddPoint AddPointDialog(this); 
    AddPointDialog.setModal(true); 
    connect(&AddPointDialog, SIGNAL(accepted()), this, SLOT(DialogAccepted())); 
    AddPointDialog.exec(); 
} 
Смежные вопросы