0

好的,我是一个初学者,但我在这里遗漏了一些东西。浏览了 Qt 文档/示例以及我可以通过 Google 挖掘的所有内容。所有类似的信息在上下文中都略有不同......

我刚开始使用 Qt SIGNALS 和 SLOTS,我在 gui 示例和课程中都很成功。现在,我想将子类中的 SIGNAL 与兄弟类中的 SLOT 连接起来,并在父主类中定义 Connect。最终,我的目标是在处理 QTcpSocket 的类中接收 iamges,并将数据作为 char* 发出以由另一个类处理(保存或显示)。

现在,我刚刚在控制台应用程序中创建了最基本的排列版本作为学习练习。我有一个发送者类...

发件人.h

#ifndef SENDER_H
#define SENDER_H

#include <QObject>

class sender : public QObject
{
    Q_OBJECT

public:
    sender(QObject *parent = 0);
    ~sender();
signals:
    void output(int data);
public slots:
    void test(int data);
private:    
};

#endif // SENDER_H

发件人.cpp

#include <iostream>
#include "sender.h"

sender::sender(QObject *parent)
    : QObject(parent)
{
    std::cout << "Created sender" << std::endl;
    int stuff = 47;
    std::cout << "stuff = " << stuff << std::endl;

    connect(this, SIGNAL(output(int)), this, SLOT(test(int)));

    emit output(stuff);
}

void sender::test(int data)
{
    std::cout << "Got to test, data = " << data << std::endl;
}

sender::~sender()
{
    std::cout << "Destroying sender" << std::endl;
}

...和一个接收器类...

接收器.h

#ifndef RECEIVER_H
#define RECEIVER_H

#include <QObject>

class receiver : public QObject
{
    Q_OBJECT

public:
    receiver(QObject *parent = 0);
    ~receiver();
public slots:
    void input (int data);
private:
};

#endif // RECEIVER_H

接收器.cpp

#include <iostream>
#include "receiver.h"

receiver::receiver(QObject *parent)
    : QObject(parent)
{
    std::cout << "Created receiver" << std::endl;
}

void receiver::input(int data)
{
    std::cout << "Got data as = " << data << std::endl;
}

receiver::~receiver()
{
    std::cout << "Destroying receiver" << std::endl;
}

我的主要看起来像这样......

主文件

#include <QtCore/QCoreApplication>
#include <iostream>
#include "sender.h"
#include "receiver.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    receiver myReceiver;
    sender mySender;

    if (QObject::connect(&mySender, SIGNAL(output(int)), 
        &myReceiver, SLOT(input(int))))
    {
        std::cout << "Got here so connect returned true" << std::endl;
    }

    return a.exec();
}

我添加了 cout 输出和 sender::test 函数来尝试找出发生了什么。

对我来说,这可以干净地编译并且运行时没有任何警告或错误,但是 sender::test SLOT 被称为 receiver::input SLOT 却没有。main 中的连接测试返回 true,并且发送方或接收方都不会过早销毁。控制台输出是...

Created receiver
Created sender
stuff = 47
Got to test, data = 47
Got here so connect returned true

所以发出了 SIGNAL,SIGNAL 和 SLOT 参数匹配,我在 sender.h 和 receiver.h 中都有 Q_OBJECT 宏,并且都继承自和 #include QObject。

怎么了???

PS我正在运行4.8.3,IDE是带有Qt插件的VS2010。

4

2 回答 2

0

答案很简单:您在将信号连接到接收器之前和将其连接到自身之后发送信号。所以你的输出是绝对正确的。

于 2013-02-19T17:23:37.937 回答
0

仅在所有内容都已连接后才发出所有内容。这里发送者的实例化发生在发送者和接收者连接之前,这就是发送完成的地方。

于 2013-02-19T18:27:04.797 回答