0

QT Creator によって作成された 2 つのフォームがあります。Signal & Slot を使用して、これら 2 つのフォーム間でデータを転送しました。しかし、データを受信できません。

そして、これらは私のアプリケーションの2つのフォームです

Form1.h

class Form1: public QDialog
{

...........

private slots:
    void on_btnOK_clicked();

signals:
    void SendId(int id);
};

Form1.cpp

#include "form2.h"

void Form1::on_btnOK_clicked()
{
   emit SendId(2);            //ID = 2

   Form2 form2;
   form2.setModal(true);
   form2.exec();
}

Form2.h

class Form2 : public QDialog
{

...........

public slots:
   void ReceiveId(int id);
private:
   Form1* m_pForm1;
};

Form2.cpp

Form2::Form2(QWidget *parent) :
QDialog(parent),
ui(new Ui::Form2)

{
   ui->setupUi(this);
   m_pForm1 = new Form1(this);

    // Connecting the signal we created in the Form1
    // with the slot created in the Form2
    QObject::connect(m_pForm1, SIGNAL(SendId(int)),
                     this, SLOT(ReceiveId(int)));
}

void Form2::ReceiveId(int id)
{
    qDebug() << "Received id";
}

アプリケーションを実行すると、 「Received id」というメッセージが表示されません。私の申請は間違っていますか?

あなたはなにか考えはありますか?

ありがとう!

4

3 に答える 3

1

信号を発信した後、フォーム 2 を作成しました。m_pForm1 のポインターはまったく新しい Form であり、役に立ちません。次のようにコードを変更します。

Form1::Form1()//change your constructor depending on your need
{
   m_pForm2 = new Form2;
   form2->setModal(true);
   connect(this, SIGNAL(sendId(int)), m_pForm2, SLOT(receiveId(int))); 
}

void Form1::on_btnOK_clicked()
{
   m_pForm2->show();
   emit SendId(2);            //ID = 2

}
于 2013-07-17T05:47:04.550 に答える
1

聞いている Form1 インスタンスがシグナルを発生させていないためだと思います。

Form1 のインスタンスの作成を開始し、それを表示して [OK] ボタンをクリックするとします。次に、この Form1 のインスタンスがシグナルを発生させますが、まだ誰もリッスンしていません。

void Form1::on_btnOK_clicked()
{
   emit SendId(2); // No one is listening yet

   Form2 form2;
   form2.setModal(true);
   form2.exec();
}

Form2 インスタンスが作成されて表示され、その内部で別の Form1 インスタンスが作成されます。Form2 は新しい Form1 SendIdシグナルに接続しますが、この新しい Form1 が表示されないため、このシグナルは送信されません

Form2::Form2(QWidget *parent) :
QDialog(parent),
ui(new Ui::Form2)

{
   ui->setupUi(this);
   m_pForm1 = new Form1(this);  // You're creating a new Form1 instance, but you never show it
    QObject::connect(m_pForm1, SIGNAL(SendId(int)),
                     this, SLOT(ReceiveId(int))); // SendId signal of the new Form1 is never raised
}
于 2013-07-17T05:46:22.177 に答える