【问题标题】:the code crashes due to an issue on connect'ing signal & slot由于连接信号和插槽的问题,代码崩溃
【发布时间】:2014-08-27 03:39:00
【问题描述】:

我有以下代码创建people 对象并通过QVector 存储对象。出于调试目的,我添加了一个名为 foo() 的信号和一个名为 outputData() 的 Slot,以查看 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

ma​​inwindow.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

ma​​in.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

ma​​inwindow.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();
}

people.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;
}

【问题讨论】:

    标签: c++ qt signals-slots


    【解决方案1】:

    People 似乎是一个未初始化的指针。您不创建people 对象,而只是在connect 调用中使用未初始化的指针。然后,这将尝试在People 可能指向的任何随机内存位置访问people 对象,从而导致分段错误。

    您可能想先创建 People 对象,例如将 People(new people()) 添加到初始化列表中。

    【讨论】:

    • 谢谢,它解决了问题。如果你有时间,你能告诉我qvector的用法是否正确存储对象(人)?
    • 再看一遍,foo()MainWindow 的信号,而不是people,那不就是connect(this, SIGNAL(foo()), ...)吗?而People 则不需要成为该类的成员变量,因为它仅在ParseData() 中使用。它可能只是该函数中的局部变量。关于向量:推送到它并访问这样的元素应该可以工作。也许将它设为MainWindow 的成员变量而不是全局变量会更合适,但这取决于您打算用它做什么。
    • 非常感谢。我注意到我试图解决的问题(有信号)。在您发表评论后也解决了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    相关资源
    最近更新 更多