我有以下代码创建people
对象并通过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
主窗口.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
people.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
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
主窗口.cpp
#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();
}
人.cpp
#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;
}
最佳答案
People
似乎是一个未初始化的指针。您不创建 people
对象,而只是在 connect
调用中使用未初始化的指针。然后,这将尝试在 People
可能指向的任何随机内存位置访问 people
对象,从而导致段错误。
您可能想先创建 People
对象,例如将 People(new people())
添加到初始化列表。
关于c++ - 由于连接信号和槽的问题导致代码崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24597320/