Qt5 发送信号,槽函数没有被调用

Jan_Sen 2016-01-05 03:54:01
我写了两个类,一个是mdspi,一个是mduser。mdspi类有个函数A,emit一个信号并调用mduser类的函数B,函数B被调用后,也会emit一个信号。现在运行结果是,不管是A调用B还是B调用A,都是第一个函数的槽函数被调用,而第二个函数也被执行了但是槽函数就没有被调用到。请问大神是什么原因呢?

#ifndef MDUSER
#define MDUSER
#include<QObject>
class Mduser : public QObject
{
Q_OBJECT
public:
Mduser(QObject *parent = 0);
public slots:
void B();

signals:
void send(QString message);
};
#endif // MDUSER

#include"mduser.h"
#include<QDebug>
#include"mdspi.h"

Mduser::Mduser(QObject *parent) :
QObject(parent)
{
}
void Mduser::B()
{
emit send("B");
qDebug() << "This is function B! " << endl;
}

#ifndef MDSPI
#define MDSPI
#include <QObject>
#include "mduser.h"
class mdspi: public QObject
{
Q_OBJECT
public:
mdspi(QObject *parent = 0);
public slots:
A();
signals:
send(QString message);
private:
Mduser md;
};
#endif // MDSPI

#include "mdspi.h"
#include <qDebug>
mdspi::mdspi(QObject *parent) :
QObject(parent)
{
}
mdspi::A()
{
qDebug() << "This is function A!" << endl;
emit send("A");
md.B();
}

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "mdspi.h"
#include "mduser.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void receive(QString message);
void receive2(QString message);
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::MainWindow *ui;
mdspi spi;
Mduser md;
};
#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

connect(&spi,SIGNAL(send(QString)),this,SLOT(receive(QString)));
connect(&md,SIGNAL(send(QString)),this,SLOT(receive2(QString)));

}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
spi.A();
}
void MainWindow::receive(QString message)
{
qDebug() << "receive A" << endl;
ui->lineEdit->setText(message);
}
void MainWindow::receive2(QString message)
{
qDebug() << "receive B" << endl;
ui->lineEdit_2->setText(message);
}
void MainWindow::on_pushButton_2_clicked()
{
md.B();
}
...全文
1272 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jan_Sen 2016-01-11
  • 打赏
  • 举报
回复
引用 8 楼 u013466477 的回复:
“spi实例的确是传入到mduser的。” 既然是传进去的,那你直接connect你传进去的那个spi 传进去的spi哪里定义的?就在哪里connect,应该是可以的 connect(spi, SIGNAL(send(QString)), this, SLOT(Slot(QString)));
问题解决了,感谢我科!
Jan_Sen 2016-01-07
  • 打赏
  • 举报
回复
引用 2 楼 u013466477 的回复:
那是因为你的Mdspi类和MainWindow类里面都有md这个成员变量,但是这两个变量根本就不是一个。 函数A()调用的md.B()函数里面发送的信号的接收是在A()这个类里,而不是MainWindow类。 除非你把MainWindow的md传到Mdspi这个类
这个明白了。 请允许我再问个问题。假如类mdspi里有函数A,C;另外mduser类是一个封装好的接口,是一个普通的C++类,没有继承QObject,也没有Q_OBJECT,有函数B,函数B就是函数A的响应函数,回调用函数C。如果我想在函数C上发送信号到界面,要怎么实现呢?(在这里,两个类的函数是可以相互调用的,还有需要指出的是mduser类的实现已经封装成dll了,不能改)
#ifndef MDSPI
#define MDSPI
#include <QObject>
#include "mduser.h"
class mdspi: public QObject
{
    Q_OBJECT
public:
    mdspi(QObject *parent = 0);
public slots:
    A();
    C();
signals:
    send(QString message);
private:
    Mduser md;
};
#endif // MDSPI

#include "mdspi.h"
#include <qDebug>
mdspi::mdspi(QObject *parent) :
    QObject(parent)
{
}
mdspi::A()
{
    qDebug() << "This is function A!" << endl;
    emit send("A");
    md.B();
}
mdspi::C()
{
    qDebug() << "This is function C!" << endl;
    emit send("C");

class Mduser
{
public:
    void B();
    mdspi spi;
};


void Mduser::B()
{
    qDebug() << "This is function B!" << endl;
    spi.C();
}
这个问题困扰挺久了,麻烦帮帮忙
引用 4 楼 qq_14996567 的回复:
[quote=引用 2 楼 u013466477 的回复:] 那是因为你的Mdspi类和MainWindow类里面都有md这个成员变量,但是这两个变量根本就不是一个。 函数A()调用的md.B()函数里面发送的信号的接收是在A()这个类里,而不是MainWindow类。 除非你把MainWindow的md传到Mdspi这个类
这个明白了。 请允许我再问个问题。假如类mdspi里有函数A,C;另外mduser类是一个封装好的接口,是一个普通的C++类,没有继承QObject,也没有Q_OBJECT,有函数B,函数B就是函数A的响应函数,回调用函数C。如果我想在函数C上发送信号到界面,要怎么实现呢?(在这里,两个类的函数是可以相互调用的,还有需要指出的是mduser类的实现已经封装成dll了,不能改)
#ifndef MDSPI
#define MDSPI
#include <QObject>
#include "mduser.h"
class mdspi: public QObject
{
    Q_OBJECT
public:
    mdspi(QObject *parent = 0);
public slots:
    A();
    C();
signals:
    send(QString message);
private:
    Mduser md;
};
#endif // MDSPI

#include "mdspi.h"
#include <qDebug>
mdspi::mdspi(QObject *parent) :
    QObject(parent)
{
}
mdspi::A()
{
    qDebug() << "This is function A!" << endl;
    emit send("A");
    md.B();
}
mdspi::C()
{
    qDebug() << "This is function C!" << endl;
    emit send("C");

class Mduser
{
public:
    void B();
    mdspi spi;
};


void Mduser::B()
{
    qDebug() << "This is function B!" << endl;
    spi.C();
}
这个问题困扰挺久了,麻烦帮帮忙[/quote] 还有一个就是,无法通过Mduser.spi这种方式获取到 mdspi的实例。
Jan_Sen 2016-01-07
  • 打赏
  • 举报
回复
引用 2 楼 u013466477 的回复:
那是因为你的Mdspi类和MainWindow类里面都有md这个成员变量,但是这两个变量根本就不是一个。 函数A()调用的md.B()函数里面发送的信号的接收是在A()这个类里,而不是MainWindow类。 除非你把MainWindow的md传到Mdspi这个类
这个明白了。 请允许我再问个问题。假如类mdspi里有函数A,C;另外mduser类是一个封装好的接口,是一个普通的C++类,没有继承QObject,也没有Q_OBJECT,有函数B,函数B就是函数A的响应函数,回调用函数C。如果我想在函数C上发送信号到界面,要怎么实现呢?(在这里,两个类的函数是可以相互调用的,还有需要指出的是mduser类的实现已经封装成dll了,不能改)
#ifndef MDSPI
#define MDSPI
#include <QObject>
#include "mduser.h"
class mdspi: public QObject
{
    Q_OBJECT
public:
    mdspi(QObject *parent = 0);
public slots:
    A();
    C();
signals:
    send(QString message);
private:
    Mduser md;
};
#endif // MDSPI

#include "mdspi.h"
#include <qDebug>
mdspi::mdspi(QObject *parent) :
    QObject(parent)
{
}
mdspi::A()
{
    qDebug() << "This is function A!" << endl;
    emit send("A");
    md.B();
}
mdspi::C()
{
    qDebug() << "This is function C!" << endl;
    emit send("C");

class Mduser
{
public:
    void B();
    mdspi spi;
};


void Mduser::B()
{
    qDebug() << "This is function B!" << endl;
    spi.C();
}
这个问题困扰挺久了,麻烦帮帮忙
Jan_Sen 2016-01-07
  • 打赏
  • 举报
回复
引用 1 楼 shihoongbo 的回复:
mdspi里构建的md,凭什么要mainwindows里构建的md来响应?
懂了,感谢
冷静忍耐 2016-01-07
  • 打赏
  • 举报
回复
“spi实例的确是传入到mduser的。” 既然是传进去的,那你直接connect你传进去的那个spi 传进去的spi哪里定义的?就在哪里connect,应该是可以的 connect(spi, SIGNAL(send(QString)), this, SLOT(Slot(QString)));
Jan_Sen 2016-01-07
  • 打赏
  • 举报
回复
引用 6 楼 u013466477 的回复:
函数C()里面发信号,那信号就是spi发的,但是spi实例在mduser类里拿不到。 要么返回spi,要么spi是公有的变量。mduser类都不能改了??那怎么能获得mdspi的实例啊,除非spi是你从外面传进去的。 你的mdspi在Mduser和MainWindow都有一个实例吗??怎么会有这样的设计 你的connect在MainWindow里吧,MainWindow里的mdspi链接才会响应槽函数 Mduser里的mdspi发送的信号,在不能获得实例的情况下,根本没有connect的地方,所以实现不了。 (如果Mduser可以得到mdspi实例,本来Mduser里的mdspi,connect应该在mdspi,因为mdspi有Mduser实例md,,但是响应还是在mdspi类里。其实就是没用的操作,看下面) connect(md->spi(), SIGNAL(send(QString)), this, SLOT(sendSlot(QString))); //connect在mdspi,this就是mdspi sendSlot(QString)还是在mdspi,就是说emit send("C");还是在mdspi里接收的。所以emit send("C");这个是没用的(C()函数只是md调用的,不是界面调用的)
先感谢你如此认真的回答我的问题。 是这样子的,mduser类呢其实是别人已经封装好的dll,只提供.h文件,也就是说类的实现看不到也不能改。spi实例的确是传入到mduser的。其他的代码什么的都可以改的。而且尝试通过Mduser.spi这种方式,还是得不到spi。
冷静忍耐 2016-01-07
  • 打赏
  • 举报
回复
函数C()里面发信号,那信号就是spi发的,但是spi实例在mduser类里拿不到。 要么返回spi,要么spi是公有的变量。mduser类都不能改了??那怎么能获得mdspi的实例啊,除非spi是你从外面传进去的。 你的mdspi在Mduser和MainWindow都有一个实例吗??怎么会有这样的设计 你的connect在MainWindow里吧,MainWindow里的mdspi链接才会响应槽函数 Mduser里的mdspi发送的信号,在不能获得实例的情况下,根本没有connect的地方,所以实现不了。 (如果Mduser可以得到mdspi实例,本来Mduser里的mdspi,connect应该在mdspi,因为mdspi有Mduser实例md,,但是响应还是在mdspi类里。其实就是没用的操作,看下面) connect(md->spi(), SIGNAL(send(QString)), this, SLOT(sendSlot(QString))); //connect在mdspi,this就是mdspi sendSlot(QString)还是在mdspi,就是说emit send("C");还是在mdspi里接收的。所以emit send("C");这个是没用的(C()函数只是md调用的,不是界面调用的)
冷静忍耐 2016-01-05
  • 打赏
  • 举报
回复
那是因为你的Mdspi类和MainWindow类里面都有md这个成员变量,但是这两个变量根本就不是一个。 函数A()调用的md.B()函数里面发送的信号的接收是在A()这个类里,而不是MainWindow类。 除非你把MainWindow的md传到Mdspi这个类
未狂 2016-01-05
  • 打赏
  • 举报
回复
mdspi里构建的md,凭什么要mainwindows里构建的md来响应?

16,815

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧