Russian Qt Forum
Ноябрь 24, 2024, 06:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Проблема connect разных классов.  (Прочитано 4623 раз)
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?
« Последнее редактирование: Январь 26, 2012, 00:03 от Glaciuse » Записан
mutineer
Гость
« Ответ #1 : Январь 25, 2012, 13:56 »

В connect надо указатели на объекты передавать, а не сами объекты. В документации написано...

И причем тут GUI ?
Записан
danquimby
Гость
« Ответ #2 : Январь 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();
}

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

Записан
danquimby
Гость
« Ответ #3 : Январь 25, 2012, 17:11 »

и еще , тема не верная , конект соединяет
ОДИНАКОВЫЕ классы.
1. наследники от QObject или его производных
2. они должны иметь макрос Q_OBJECT

эти 2 параметра и все будет тип топ
Записан
twp
Гость
« Ответ #4 : Январь 25, 2012, 17:12 »

Код
C++ (Qt)
QObject::connect(&obj1 , SIGNAL(smthEvent()) , &obj2 , SLOT(smthToDo()) );
 
Записан
danquimby
Гость
« Ответ #5 : Январь 25, 2012, 18:04 »

Код
C++ (Qt)
QObject::connect(&obj1 , SIGNAL(smthEvent()) , &obj2 , SLOT(smthToDo()) );
 
ну да если связывать ты будешь в классе или как в данном случае
когда QObgect не является производным
То нужно указывать QObject::    Улыбающийся
Записан
mutineer
Гость
« Ответ #6 : Январь 25, 2012, 18:21 »

2 danquimby: ты только что убил мой неокрепший мозг
Записан
danquimby
Гость
« Ответ #7 : Январь 25, 2012, 18:25 »

2 danquimby: ты только что убил мой неокрепший мозг
отвратительно, первый труп на мои крепкие плечи  Строит глазки
Записан
twp
Гость
« Ответ #8 : Январь 25, 2012, 19:26 »

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

Записан
danquimby
Гость
« Ответ #9 : Январь 25, 2012, 19:38 »

я думаю тут уже начался флуд, так что я вроде набросал пример.
Если автор не понял, ну тогда доки в зубы.
Записан
Glaciuse
Гость
« Ответ #10 : Январь 25, 2012, 20:01 »

Спасибо danquimby,twp,mutineer за ответы, со всем разобрался.
danquimby, большое спасибо за пример.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.087 секунд. Запросов: 21.