c++ - QT 使用接受的信号连接崩溃

标签 c++ qt

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

主要.cpp

#include < QApplication >

#include "mainwindow.h"

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

    MainWindow win;
    win.show();

    return app.exec();
}

主窗口.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

主窗口.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");
}

添加点.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

添加点.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\build-xxx-Desktop_Qt_5_4_2_MSVC2013_64bit-Debug\debug\xx.exe 崩溃了”

我注意到我用这段代码做了一些实验,我发现我在 mainwindow.cpp 的 signal accpeted() 有问题。我不知道我该怎么做才能解决这个问题。我希望你能帮助我。

最佳答案

AddPointDialog 是未初始化的指针,它还没有指向 MainWindow 构造函数中的有效 AddPoint。你不能在上面调用 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();
}

关于c++ - QT 使用接受的信号连接崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32802169/

相关文章:

c++ - 如何在 Qt 应用程序中替换 'gluOrtho2d'

c++ - 我可以有正确的 qmake,但有错误的 qt 吗?

c++ - 使用 QString 打印带有加号或减号的 double 值

java - Swing - Qt 信号/槽的替代品

c++ - new[size] object(args ... ) ,数组 new [-fpermissive] 中的 GCC 括号初始化器

c++ - 找出 C/C++ 程序的运行时间

c++ - 过度依赖宏

c++ - 校准期间 OpencV 错误

C++ WM_KEYDOWN 不同的间隔

css - 自定义 QHeaderView 调整大小句柄