c++ - 由于连接信号和槽的问题导致代码崩溃

标签 c++ qt signals-slots

我有以下代码创建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/

相关文章:

c++ - 将 __declspec(selectany) 与静态数据一起使用是否对该数据的初始化顺序有任何影响?

c++ - 如何在 C++ 中遍历 LPBYTE 的每个字节

c++ - 如何在没有 Qt 项目的情况下在 Visual Studio 中使用 Qt 资源文件?

c++ - Qt音乐播放器: mini player mode

multithreading - PyQt:如何将停止信号发送到对象正在运行有条件的 while 循环的线程?

qt - 在 Qt 中,许多插槽连接到同一个信号,它们在发出信号时是否按顺序调用?

c++ - C/C++ 中的矩阵遍历

c++ - 模板类中的模板化构造函数

qt - 如何在工具提示中绘制内容?

线程和图形用户界面应用程序之间的 Python 新样式信号和槽