Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Glaciuse от Январь 25, 2012, 13:52



Название: [Решено] Проблема connect разных классов.
Отправлено: Glaciuse от Январь 25, 2012, 13:52
Есть такой код:

#include "SomeClass1.h"
#include "SomeClass2.h"
#include <QtGui/QApplication>

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   SomeClass1 obj1;
   SomeClass2 obj2;

   obj1.show();
   obj2.show();
   return app.exec();
}

В классе SomeClass1 есть сигнал с названием smthEvent, а в классе SomeClass2 есть слот smthToDo.

Нужно связать сигнал smthEvent класса SomeClass1 со слотом smthToDo класса SomeClass2.

Класс SomeClass1 наследуется от QWidget, класс SomeClass2 от QLabel.

Если добавить в main() после инициализации объектов obj1 и obj2 строку:
QObject::connect( obj1 , SIGNAL(smthEvent()) , obj2 , SLOT(smthToDo()) );
, то компилятор ругается на то, что для connect нет конструктора данного типа.

Как правильно связать сигнал smthEvent со слотом smthToDo?


Название: Re: Проблема connect разных классов.
Отправлено: mutineer от Январь 25, 2012, 13:56
В connect надо указатели на объекты передавать, а не сами объекты. В документации написано...

И причем тут GUI ?


Название: Re: Проблема connect разных классов.
Отправлено: danquimby от Январь 25, 2012, 17:09
навая не проверял :) это для наглядности . все они от QObject
все равно все приходят к нему, так что пример все равно актуален.

Код:
class SomeClass1 : public QObject
{
Q_OBJECT
public:
void emiting()
{
emit smthEvent();
}

signals:
void smthEvent();
};
class SomeClass2 : public QObject
{
Q_OBJECT
public:

public slots:
void smthToDo();
};
// реализация обратная от template нельзя реализовывать в теле класса
void SomeClass2::smthToDo()
{
qDebug("SomeClass2::smthToDo()");
}

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   // нужно делать динамическими , а не статическими
   SomeClass1* obj1 = new SomeClass1;
   SomeClass2* obj2 = new SomeClass2;
   // саязываем
   connect(obj1,SIGNAL(smthEvent()),obj2,SLOT(smthToDo()));
   obj1->emiting();

   return app.exec();
}

надеюсь я тебе помог хотя бы не много понять сигналы\слоты ... кстати могу быть и сигнал\сигнал :)



Название: Re: Проблема connect разных классов.
Отправлено: danquimby от Январь 25, 2012, 17:11
и еще , тема не верная , конект соединяет
ОДИНАКОВЫЕ классы.
1. наследники от QObject или его производных
2. они должны иметь макрос Q_OBJECT

эти 2 параметра и все будет тип топ


Название: Re: Проблема connect разных классов.
Отправлено: twp от Январь 25, 2012, 17:12
Код
C++ (Qt)
QObject::connect(&obj1 , SIGNAL(smthEvent()) , &obj2 , SLOT(smthToDo()) );
 


Название: Re: Проблема connect разных классов.
Отправлено: danquimby от Январь 25, 2012, 18:04
Код
C++ (Qt)
QObject::connect(&obj1 , SIGNAL(smthEvent()) , &obj2 , SLOT(smthToDo()) );
 
ну да если связывать ты будешь в классе или как в данном случае
когда QObgect не является производным
То нужно указывать QObject::    :)


Название: Re: Проблема connect разных классов.
Отправлено: mutineer от Январь 25, 2012, 18:21
2 danquimby: ты только что убил мой неокрепший мозг


Название: Re: Проблема connect разных классов.
Отправлено: danquimby от Январь 25, 2012, 18:25
2 danquimby: ты только что убил мой неокрепший мозг
отвратительно, первый труп на мои крепкие плечи  ::)


Название: Re: Проблема connect разных классов.
Отправлено: twp от Январь 25, 2012, 19:26
я как бы показал что в connect нужно передавать указатели на объект, а не сами объекты
По идее это и была ошибка ТС:
Цитировать
Если добавить в main() после инициализации объектов obj1 и obj2 строку:
QObject::connect( obj1, SIGNAL(smthEvent()) , obj2, SLOT(smthToDo()) );
, то компилятор ругается на то, что для connect нет конструктора данного типа.



Название: Re: Проблема connect разных классов.
Отправлено: danquimby от Январь 25, 2012, 19:38
я думаю тут уже начался флуд, так что я вроде набросал пример.
Если автор не понял, ну тогда доки в зубы.


Название: Re: Проблема connect разных классов.
Отправлено: Glaciuse от Январь 25, 2012, 20:01
Спасибо danquimby,twp,mutineer за ответы, со всем разобрался.
danquimby, большое спасибо за пример.