0

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です。

4

2 に答える 2

0

Do all は、すべてが接続された後にのみ放出します。ここでは、送信者と受信者が接続される前に送信者のインスタンス化が行われ、そこで発行が行われます。

于 2013-02-19T18:27:04.797 に答える
0

答えは非常に簡単です。受信機に接続すると、それ自体に接続した後に信号を送信しています。したがって、出力は完全に正しいです。

于 2013-02-19T17:23:37.937 に答える