У меня очень странная проблема с методом 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
и его дочерние элементы изменены. Что может быть источником проблемы.
getListView()
действительно реализовано. Также, когда вы пытаетесь запустить приложение, оно жалуется, что не может установить соединение? В Linux он просто сбрасывал его вstderr
. - person Karlson   schedule 04.04.2012virtual void QListWidget::event(QEvent*)
или перегружаете эту функцию, чтобы она не принимала аргументы? - person tmpearce   schedule 04.04.2012event
во что-то другое (например,myEvent
). 2) Убедитесь, что объект, который должен получать сигнал, не уничтожен до того, как сигнал будет отправлен (добавьте сообщение печати в деструктор). - person tmpearce   schedule 04.04.2012signal
иslot
должны совпадать. И если вы на самом деле повторно реализуете сигнал, лучше объявить его какsignal
просто для вашей ясности. - person Karlson   schedule 04.04.2012signal
в конце концов является защищенным методом, я не думаю, что можно вызывать такой метод из другой иерархии. - person Y.H.   schedule 04.04.2012signal
— это метод. Объект, у которого есть этот метод, вызывает его;signal
вызывает любой подключенныйslots
. Таким образом, доступ не является проблемой в конце концов. Подключение к защищенным/приватным слотам — это отдельная история. - person tmpearce   schedule 04.04.2012CompositeView
в макет основного виджета, я могу заставить основной виджет реагировать на этот неприятный сигнал. - person Y.H.   schedule 04.04.2012