1

メソッドに非常に奇妙な問題がありQObject::connectます。まず、この非常に単純なコードを見てください。

class B : public QWidget {
  Q_OBJECT
public:
  explicit B(QWidget* parent = 0) : QWidget(parent) { }
signals:
  void event();
}

class A : public QObject {
  Q_OBJECT
public:
  explicit A(QWidget* parent = 0) : QObject(parent) { b = new B(parent); init(); }
  void init() { QObject::connect(b, SIGNAL(event()), this, SLOT(handler())); }
public slots:
  void handler() { /*spit out some text*/ }
private:
  B* b;
}

のオブジェクトは、 のオブジェクトから発信された信号に応答しA ませんB。期待通りに信号が発信されていると確信しています。成功を示すメソッドのQObject::connect戻り値。qmakemoctrueを実行しましたが、moc_ .cpp* ファイルは正しいようです。

どこで間違えたのだろうか?

編集I:

ここに私が取り組んでいるコードがあります。関連する部分だけが表示されるように削除されています:

class ListController : public QObject {
  Q_OBJECT
public:
  explicit ListController(Model* model, QWidget* parent = 0) : QObject(parent) { compositeView = new CompositeView(parent); initConnections(); }
  void initConnections() { QObject::connect(compositeView->getListView(), SIGNAL(event()), this, SLOT(handler())); }
public slots:
  void handler() { qDebug()<<"signal is received ..."; }
private:
  CompositeView* view;
};

class CompositeView: public QGroupBox {
  Q_OBJECT
public:
  explicit CompositeView(QWidget* parent = 0) : QGroupBox(parent) { listView = new ListView(this); }
  ListView* getListView() const { return listView; }
private:
  ListView* listView;
};

class ListView : public QListWidget {
  Q_OBJECT
public:
  explicit ListView(QWidget* parent = 0) : QListWidget(parent) { }
protected:
  void dropEvent(QDropEvent *event) { emit signal(); }
signals:
  void signal();
};

自分自身を親として渡し、適切なオブジェクトを提供するサブクラス内に新しいListControllerオブジェクトを作成します。QWidgetModel

編集Ⅱ

オブジェクトをメイン ウィジェットに返しListControllerます。CompositeViewメイン ウィジェットは、複合ビューをそのレイアウトに追加します。この時点で、CompositeViewとその子の親が変更されます。これが問題の原因である可能性があります。

4

2 に答える 2

1

この問題の答えは、私が思っていたよりずっと簡単でした。

次の手順を実行するのを間違えたと思います。

  1. ListControllerスタック上に作成されます。
  2. CompositeViewオブジェクトが返され、メインのウィジェット レイアウトに追加されます。
  3. ListControllerオブジェクトは静かに範囲外になり、破棄され、その結果、接続が失われます。

上からのコメント13は実際には解決策でした。tmpearce さん、アドバイスありがとうございます。

于 2012-04-04T21:25:12.600 に答える
0
singals:
  void signal();

作業している実際のコードであるとは思えませんが、タイプミスを確認してください。

于 2012-04-04T20:07:35.420 に答える