QT使用接受的信号连接崩溃

时间:2015-09-26 21:23:46

标签: c++ qt

我的Qt代码有问题。我想编写一个程序,它采用点坐标,然后该点与该坐标一致。当我构建它时,我的程序没有任何错误或警告,但它在开始时崩溃(MainWindow没有显示)。这是我的代码:

的main.cpp

monster_size

mainwindow.h

#include < QApplication >

#include "mainwindow.h"

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

    MainWindow win;
    win.show();

    return app.exec();
}

mainwindow.cpp

#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

addpoint.h

#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.cpp

#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

运行程序后,我在aplication output lap中看到: &#34;该计划意外完成。&#34; &#34; C:\ QT \ build-xxx-Desktop_Qt_5_4_2_MSVC2013_64bit-Debug \ debug \ xx.exe崩溃&#34;

我注意到我用这段代码做了一些实验,我发现我在mainwindow.cpp遇到信号问题()。我不知道该怎么办这个问题。我希望你能帮助我。

1 个答案:

答案 0 :(得分: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();
}