C++ 由于connect';上的问题,代码崩溃;荷兰国际广播公司;狭槽
我有下面的代码创建C++ 由于connect';上的问题,代码崩溃;荷兰国际广播公司;狭槽,c++,qt,signals-slots,C++,Qt,Signals Slots,我有下面的代码创建人对象,并通过QVector存储对象。出于调试目的,我添加了一个名为foo()的信号和一个名为outputData()的插槽,以查看QVector(list)是否正确存储了值 我通过以下方式连接信号和插槽: connect(People, SIGNAL(foo()), this , SLOT( outputData() ) ); 在mainwindow.cpp文件上。Gcc构建代码,不输出任何错误或警告。但是,当我运行程序时,SIGSEV会终止进程 谁能告诉我connec
人
对象,并通过QVector
存储对象。出于调试目的,我添加了一个名为foo()
的信号和一个名为outputData()
的插槽,以查看QVector(list
)是否正确存储了值
我通过以下方式连接信号和插槽:
connect(People, SIGNAL(foo()), this , SLOT( outputData() ) );
在mainwindow.cpp文件上。Gcc构建代码,不输出任何错误或警告。但是,当我运行程序时,SIGSEV
会终止进程
谁能告诉我connect()
上的错误是什么
存储对象是否正确使用了QVector
code.pro
QT += core gui
QT += network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = untitled1
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp \
people.cpp
HEADERS += mainwindow.h \
people.h
FORMS += mainwindow.ui
main window.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QUdpSocket>
#include <QString>
#include "people.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
// void outputData();
public slots:
void outputData();
private slots:
void readyRead();
signals: void foo();
private:
Ui::MainWindow *ui;
QUdpSocket udpSocket;
people *People;
void processPendingDatagrams();
void udp_transfer(QString data);
void ParseData(QByteArray data);
};
#endif // MAINWINDOW_H
#ifndef PEOPLE_H
#define PEOPLE_H
#include <QObject>
#include <QString>
#include <QMainWindow>
class people : public QObject
{
Q_OBJECT
public:
people();
people(QString Name, int Age);
QString getName();
int getAge();
void setName(QString Name);
void setAge(int Age);
private:
QString name;
int age;
};
#endif // PEOPLE_H
People
似乎是一个未初始化的指针。您不需要创建people
对象,只需在connect
调用中使用未初始化的指针即可。然后,这将尝试访问people
可能指向的任意随机内存位置的people
对象,从而导致分段错误
您可能希望首先创建
人员
对象,例如将人员(new People())
添加到初始值设定项列表中。人员
似乎是未初始化的指针。您不需要创建people
对象,只需在connect
调用中使用未初始化的指针即可。然后,这将尝试访问people
可能指向的任意随机内存位置的people
对象,从而导致分段错误
您可能希望首先创建
人员
对象,例如将人员(new People())
添加到初始值设定项列表中。人员
似乎是未初始化的指针。您不需要创建people
对象,只需在connect
调用中使用未初始化的指针即可。然后,这将尝试访问people
可能指向的任意随机内存位置的people
对象,从而导致分段错误
您可能希望首先创建
人员
对象,例如将人员(new People())
添加到初始值设定项列表中。人员
似乎是未初始化的指针。您不需要创建people
对象,只需在connect
调用中使用未初始化的指针即可。然后,这将尝试访问people
可能指向的任意随机内存位置的people
对象,从而导致分段错误
您可能想先创建
人物
对象,例如,将人物(new People())
添加到初始值设定项列表中。谢谢,它解决了问题。如果你有时间,你能告诉我qvector的用法是否适合存储对象(人)吗?再看一遍,foo()
是main窗口的一个信号,而不是People
,那么它真的不是connect(这个,信号(foo(),…)
?而People
则不需要成为类的成员变量,因为它只在ParseData()中使用。它可能只是该函数中的局部变量。关于向量:推到它并访问这样的元素应该会起作用。也许将其设置为MainWindow
的成员变量而不是全局变量更合适,但这取决于您计划对其执行的其他操作。非常感谢。我注意到我试图解决的(信号)问题。在您的评论之后,它也解决了:)谢谢,它解决了问题。如果你有时间,你能告诉我qvector的用法是否适合存储对象(人)吗?再看一遍,foo()
是main窗口的一个信号,而不是People
,那么它真的不是connect(这个,信号(foo(),…)
?而People
则不需要成为类的成员变量,因为它只在ParseData()中使用。它可能只是该函数中的局部变量。关于向量:推到它并访问这样的元素应该会起作用。也许将其设置为MainWindow
的成员变量而不是全局变量更合适,但这取决于您计划对其执行的其他操作。非常感谢。我注意到我试图解决的(信号)问题。在您的评论之后,它也解决了:)谢谢,它解决了问题。如果你有时间,你能告诉我qvector的用法是否适合存储对象(人)吗?再看一遍,foo()
是main窗口的一个信号,而不是People
,那么它真的不是connect(这个,信号(foo(),…)
?而People
则不需要成为类的成员变量,因为它只在ParseData()中使用。它可能只是该函数中的局部变量。关于向量:推到它并访问这样的元素应该会起作用。也许将其设置为MainWindow
的成员变量而不是全局变量更合适,但这取决于您计划对其执行的其他操作。非常感谢。我注意到我试图解决的(信号)问题。在您的评论之后,它也解决了:)谢谢,它解决了问题。如果你有时间,你能告诉我qvector的用法是否适合存储对象(人)吗?再看一遍,foo()
是main窗口的一个信号,而不是People
,那么它真的不是connect(这个,信号(foo(),…)
?而People
则不需要成为类的成员变量,因为它只在ParseData()中使用。它可能只是该函数中的局部变量。关于向量:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QHostAddress>
#include <QtNetwork>
#include <QVector>
QVector<people*> list;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
udpSocket.bind(2222);
connect(&udpSocket, SIGNAL(readyRead()), this, SLOT(readyRead()));
connect(People, SIGNAL(foo()), this , SLOT( outputData() ) ); //HERE IS THE PROBLEMATIC PART!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::readyRead(){
do {
QByteArray datagram;
datagram.append(udpSocket.pendingDatagramSize());
udpSocket.readDatagram(datagram.data(), datagram.size());
ParseData(datagram);
} while (udpSocket.hasPendingDatagrams());
}
void MainWindow::ParseData(QByteArray data){
QString name;
int i = 0;
for (i=0; i<4; i++){
name.append(QString("%1").arg(data[i]));
}
QString temp;
for (i=0; i<2; i++){
temp.append(QString("%1").arg(data[i+4]));
}
int age = temp.toInt();
People = new people(name, age);
qDebug() << "msg is received";
list.push_back(People);
emit foo();
}
void MainWindow::outputData(){
qDebug() << "size:" << list.size();
qDebug() << "name:" << list[0]->getName();
qDebug() << "Age:" << list[0]->getAge();
}
#include "people.h"
people::people(){
name = "No name";
age = 0;
}
people::people(QString Name, int Age){
name = Name;
age = Age;
}
QString people::getName(){
return name;
}
int people::getAge(){
return age;
}
void people::setName(QString Name){
name = Name;
}
void people::setAge(int Age){
age = Age;
}