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
ListController
将CompositeView
对象返回到主窗口小部件。主窗口小部件将复合视图添加到其布局中。此时,CompositeView
的父级及其子级已更改。这可能是问题的根源。
答案 0 :(得分:1)
这个问题的答案比我想象的容易得多。
我认为我做了以下步骤的错误:
ListController
是在堆栈上创建的。CompositeView
对象并将其添加到主窗口小部件布局中。ListController
对象默默地超出范围并被破坏,从而导致连接。从顶部评论13实际上是解决方案。非常感谢tmpearce提供了建议。
答案 1 :(得分:0)
singals:
void signal();
我怀疑,如果它是您正在使用的实际代码,请检查拼写错误。