2013-02-19 30 views
0

好吧,我是一个初学者,但我在这里错过了一些东西。遍布Qt文档/示例以及我可以通过Google挖掘的所有内容。所有类似的信息在上下文中略有不同...Qt信号和SLOT在外形上,不是线程(还)

我刚刚开始与Qt信号和时隙,我成功与gui的例子和一个类。现在,我想通过在父主类中定义的连接在子类中将信号与兄弟类中的SLOT连接起来。最终,我的目标是在处理QTcpSocket的类中接收iamges,并将数据发送为char *,以便由另一个类处理(保存或显示)。

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

sender.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 

sender.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 

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

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

的main.cpp

#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输出和发件人::测试功能,试图弄清楚发生了什么。

对我来说,这个编译干净,没有任何警告或错误运行,但发送者::测试SLOT被称为接收器::输入SLOT不。在main中的连接测试返回true,并且发送者或接收者都不被过早地销毁。控制台输出...

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

所以信号发出的信号,并SLOT参数的比赛,我有两个sender.h和receiver.h的Q_OBJECT宏,以及与这两个的#include继承QObject的。

怎么回事?

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

回答

0

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

+0

Doh。现在明显。谢谢。 – 2013-02-19 20:12:55

0

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