OK、私はまったくの初心者ですが、ここで何かが欠けています。Qt のドキュメントや例、そして Google で掘り下げることができるすべてのことを調べました。同様の情報はすべて、コンテキストがわずかに異なります...
Qt SIGNALS と SLOTS を使い始めたばかりです。GUI の例とクラス内で成功しています。ここで、親メインで定義された Connect を使用して、子クラスの SIGNAL を兄弟クラスの SLOT に接続したいと考えています。最終的に私の目的は、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;
}
私のメインはこんな感じ…
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 の出力と send::test 関数を追加して、何が起こっているのかを調べてみました。
私にとって、これはきれいにコンパイルされ、警告やエラーなしで実行されますが、sender::test SLOT が呼び出される間、receiver::input SLOT は呼び出されません。メインの接続のテストは 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 マクロがあり、両方とも QObject から継承して #include します。
どうしたの???
PS私は4.8.3を実行しており、IDEはQtプラグインを備えたVS2010です。