Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Custom widgets, QObject::connect: signal not found


Автор: Alca 13.8.2013, 21:57
Qt 5.1.0, mingw-48-x32

При запуске приложения - не находяться сигналы:
Цитата

QObject::connect: signal not found
QObject::connect: signal not found

Почему не видны сигналы из виджеты?

Исходники виджета https://bitbucket.org/skynowa/cdbimage/src
Все собиралось одним компилятором, все в релизе

Автор: Guinness 14.8.2013, 07:34
Намекну.
Код

void connectCheck(const QObject * sender, const char * signal, 
                const QObject * receiver, const char * method, 
                Qt::ConnectionType type)
{
    bool res = QObject::connect(sender, signal, receiver, method, type);
    if(res == false){
        QMessageBox::critical(0, QObject::trUtf8("Qt connect signal/slot fail"),
                        QObject::trUtf8("<b>Connection problem!!!</b><br>"
                        "Cann`t connect signal(%1) to slot(%2)<br>"
                        "Sender(%3) to receiver(%4)<br>"
                        "%3::%1<br>%4::%2")
                        .arg(signal).arg(method)
                        .arg(sender->objectName()).arg(receiver->objectName())
                    );
    }
}

Автор: Alca 14.8.2013, 08:18
Я знаю какие слоты сигналы не работают, я хочу знать почему

Автор: Guinness 14.8.2013, 08:23
Цитата(Alca @  14.8.2013,  09:18 Найти цитируемый пост)
Я знаю какие слоты сигналы не работают

Из Вашего вопроса это непонятно.
Цитата(Alca @  14.8.2013,  09:18 Найти цитируемый пост)
я хочу знать почему

Ну из той информации, указанной Вами в первом посте, единственное, что приходит в голову, это отсутствие этих сигналов или слотов.

Автор: Alca 14.8.2013, 10:08
CDbImage:
Код

Q_OBJECT

Q_SIGNALS:
    void               sig_dataChanged(cint &index);
    void               sig_pressed(QObject *sender);
    void               sig_doubleClicked(QObject *sender);


Код

...
Q_EMIT sig_dataChanged( index() );
...
Q_EMIT sig_pressed(this);
...
Q_EMIT sig_doubleClicked(this);


Это в приложении:
Код

Q_OBJECT


Код

        connect(ui.dbPhoto, &CDbImage::sig_doubleClicked,
                this,       &CMain::actView_onAlbum);

Автор: Guinness 14.8.2013, 10:24
Цитата(Alca @  14.8.2013,  11:08 Найти цитируемый пост)
Код

void               sig_pressed(QObject *sender); 
void               sig_doubleClicked(QObject *sender);


Зачем параметром передавать sender? При приеме сигнала в слоте всегда можно вызвать функцию sender(), которая вернет QObject*. Попробуйте обойтись без этого. Мне кажется, программа просто не может найти сигнал с сигнатурой sig_pressed(CDbImage *), т.е. она автоматически не преобразует this к QObject*.

Автор: Guinness 14.8.2013, 10:41
Хотя, по идее, эта ошибка должна возникать на этапе компиляции. Т.к. макрос Q_EMIT, это всего лишь синтаксический сахар. Так что выше я ошибся.

Добавлено через 3 минуты и 27 секунд
Цитата(Alca @  14.8.2013,  11:08 Найти цитируемый пост)
        
Код

connect(ui.dbPhoto, &CDbImage::sig_doubleClicked,  this, &CMain::actView_onAlbum);


Вот здесь указана функция sig_doubleClicked, хотя она объявленная в классе как  sig_doubleClicked( QObject * ). Думаю, ошибка все таки в этом.

Автор: Alca 14.8.2013, 21:17
Цитата

Вот здесь указана функция sig_doubleClicked, хотя она объявленная в классе как  sig_doubleClicked( QObject * ). Думаю, ошибка все таки в этом.


Выхлоп:
Код

D:\Projects\Qt\XXXDb\Forms\CMain.cpp:-1: error: undefined reference to `CDbImage::sig_doubleClicked(QObject*)'
D:\Projects\Qt\XXXDb\Forms\CMain.cpp:-1: error: undefined reference to `CDbImage::sig_doubleClicked(QObject*)'

Автор: Alca 14.8.2013, 22:13
Ёпт, забыл проинсталить новые хидера плагина  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)