gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:27:40 25 4
gpt4 key购买 nike

我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com