【发布时间】: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 表示成功。我运行了 qmake、moc 并且 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
ListController 将CompositeView 对象返回给主小部件。主小部件将复合视图添加到其布局中。此时CompositeView 的父级及其子级已更改。这可能是问题的根源。
【问题讨论】:
-
您的代码看起来差不多。您说您确信信号已发出 - 您是如何检查的?
-
通过响应来自另一个 QWidget 子类的信号。顺便说一句,我使用的是 SKD 4.8 版。
-
也许 handler() 中的代码正在做你认为的事情。你能证明吗?
-
是的,它们不需要在同一个层次结构中,或者根本不需要在一个层次结构中——只是从 QObject 派生的。两个想法:1)尝试将您的
event方法重命名为其他名称(例如myEvent)。 2) 确保在信号发出之前应该接收信号的对象没有被破坏(向析构函数添加打印消息)。 -
@H.Josef
signal和slot的签名必须匹配。如果您实际上是在重新实现该信号,最好将其声明为signal以便您自己清楚。
标签: qt qt-signals