Qt信号/插槽连接不起作用

时间:2012-04-04 15:21:49

标签: qt qt-signals

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表示成功。我运行了 qmake moc 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子类中创建一个新的QWidget对象,将自身作为父对象传递,并提供适当的Model对象。

编辑II

ListControllerCompositeView对象返回到主窗口小部件。主窗口小部件将复合视图添加到其布局中。此时,CompositeView的父级及其子级已更改。这可能是问题的根源。

2 个答案:

答案 0 :(得分:1)

这个问题的答案比我想象的容易得多。

我认为我做了以下步骤的错误:

  1. ListController是在堆栈上创建的。
  2. 返回CompositeView对象并将其添加到主窗口小部件布局中。
  3. ListController对象默默地超出范围并被破坏,从而导致连接。
  4. 从顶部评论13实际上是解决方案。非常感谢tmpearce提供了建议。

答案 1 :(得分:0)

singals:
  void signal();

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