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方法返回true表示成功。我跑了qmakemoc并且moc_ .cpp* 文件似乎是正确的。

我想知道我在哪里犯错了?

编辑我:

这是我正在处理的代码,它被剥离,所以只显示相关部分:

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对象,QWidget将自身作为父对象传递并提供适当的Model对象。

编辑二

将对象ListController返回CompositeView到主小部件。主小部件将复合视图添加到其布局中。此时, 的父级CompositeView及其子级发生了变化。这可能是问题的根源。

4

2 回答 2

1

这个问题的答案比我预期的要容易得多。

我认为我在执行以下步骤时犯了一个错误:

  1. ListController堆栈上创建。
  2. CompositeView对象被返回并添加到主窗口小部件布局中。
  3. ListController对象默默地超出范围并被破坏,因此连接。

顶部的评论 13 实际上是解决方案。非常感谢您的建议。

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

我怀疑,如果它是您正在工作的实际代码,那么请检查拼写错误。

于 2012-04-04T20:07:35.420 回答