Qt信号/插槽连接不工作

Qt信号/插槽连接不工作,qt,qt-signals,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* par

我对
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_uuu.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:公共QObject{
Q_对象
公众:
显式ListController(Model*Model,QWidget*parent=0):QObject(parent){compositeView=new compositeView(parent);initConnections();}
void initConnections(){QObject::connect(compositeView->getListView(),SIGNAL(event()),this,SLOT(handler());}
公众时段:
void handler(){qDebug()
我怀疑,如果它是你正在工作的实际代码,那么请检查输入错误


我怀疑,如果这是您正在使用的实际代码,那么请检查输入错误。

这个问题的答案比我预期的要简单得多

我认为我犯了以下错误:

  • ListController
    是在堆栈上创建的
  • CompositeView
    对象被返回并添加到主窗口小部件布局中
  • ListController
    对象以静默方式超出范围并被破坏,从而导致连接中断

  • 上面的第13条意见实际上就是解决办法。非常感谢你的建议。

    这个问题的答案比我想象的要简单得多

    我认为我犯了以下错误:

  • ListController
    是在堆栈上创建的
  • CompositeView
    对象被返回并添加到主窗口小部件布局中
  • ListController
    对象以静默方式超出范围并被破坏,从而导致连接中断

  • 顶部的注释13实际上就是解决方案。非常感谢您的建议。

    您的代码看起来是正确的。您说您有信心发出信号-您是如何检查的?通过响应另一个QWidget子类的信号。顺便说一句,我使用的是SKD版本4.8。可能是handler()中的代码正在做你想做的事情。你能展示一下吗?是的,它们不需要在同一个层次结构中,或者根本不需要在一个层次结构中-只是从QObject派生出来。两个想法:1)尝试将
    事件
    方法重命名为其他方法(例如
    myEvent
    ).2)确保本应接收信号的对象在信号发出前未被销毁(向析构函数添加打印消息).@H.Josef
    信号
    插槽
    的签名必须匹配。如果您实际上正在重新实现信号,最好将其声明为
    信号
    ,这只是为了您自己的清晰。您的代码看起来差不多正确。您说您确信信号已发出-您是如何检查的?通过响应信号fr另外一个QWidget子类。顺便说一句,我使用的是SKD版本4.8。也许handler()中的代码正按照你的想法运行。你能证明这一点吗?是的,它们不需要在同一层次结构中,或者根本不需要在一个层次结构中-只是从QObject派生出来。两个想法:1)尝试将
    事件
    方法重命名为其他方法(例如
    myEvent
    ).2)确保本应接收信号的对象在信号发出前未被销毁(向析构函数添加打印消息).@H.Josef
    signal
    slot
    的签名必须匹配。如果您实际重新实现信号,最好将其声明为
    signal
    ,这只是为了您自己的清晰性。感谢soumya的提示,这确实是一个打字错误,需要更正,否则会出现编译错误,但除此之外pe(我将修复)这里会有什么问题,我仍然不知道…感谢soumya的提示,这确实是一个打字错误,它需要更正,否则会出现编译错误,但除了这个类型(我将修复)这里会有什么问题,我仍然不知道。。。
    singals:
      void signal();