【问题标题】:Qt signal/slot connection does not workQt 信号/插槽连接不起作用
【发布时间】:2012-04-04 15:21:49
【问题描述】:

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();
};

我在 QWidget 子类中创建了一个新的 ListController 对象,将自身作为父对象传递并提供适当的 Model 对象。

编辑 II

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

【问题讨论】:

  • 您的代码看起来差不多。您说您确信信号已发出 - 您是如何检查的?
  • 通过响应来自另一个 QWidget 子类的信号。顺便说一句,我使用的是 SKD 4.8 版。
  • 也许 handler() 中的代码正在做你认为的事情。你能证明吗?
  • 是的,它们不需要在同一个层次结构中,或者根本不需要在一个层次结构中——只是从 QObject 派生的。两个想法:1)尝试将您的event 方法重命名为其他名称(例如myEvent)。 2) 确保在信号发出之前应该接收信号的对象没有被破坏(向析构函数添加打印消息)。
  • @H.Josef signalslot 的签名必须匹配。如果您实际上是在重新实现该信号,最好将其声明为 signal 以便您自己清楚。

标签: qt qt-signals


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:
    singals:
      void signal();
    

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

    【讨论】:

    • 感谢 soumya 的提示,这确实是一个错字,需要更正,否则会出现编译错误,但除了这种类型(我将修复)之外,这里还有什么问题,我仍然想不通...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2014-12-12
    • 2015-03-14
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多