Russian Qt Forum

Qt => Общие вопросы => Тема начата: DoZENT от Ноябрь 03, 2008, 17:08



Название: Взаимодействие классов
Отправлено: DoZENT от Ноябрь 03, 2008, 17:08
Добрый день! Такая проблема: есть класс MyServer (QObject) и есть класс MyClass (QMainWindow). В классе MyServer происходят различные события (клиент подключился или ошибка соединения вылезла). Мне надо передать в класс MyClass сигнал об этом событии. Как это сделать?


Название: Re: Взаимодействие классов
Отправлено: pastor от Ноябрь 03, 2008, 17:19
1) Создать соответствующие сигналы в MyServer
2) Создать слоты в MyClass для обработки этих сигналов
3) Создать коннекты сигналов-слотов

Когда произойдет то или ное событие в MyServer, испускаеться сигнал и обрабатываеться слотом в MyClass


Название: Re: Взаимодействие классов
Отправлено: DoZENT от Ноябрь 03, 2008, 18:27
Делаю так:

MyServer:
signals:
    void MySignal ();

В функции старта сервера:

emit (MySignal());

В MyClass:
public slots:
   void MySlot ();

void MyServer::MySlot()
{

   AddLogString("It works fine!");

}

и соедниняю сигнал со слотом:

connect (m_mainServer, SIGNAL (m_mainServer->MySignal()),
         SLOT (MySlot()) );

Ничего не происходит  :(


Название: Re: Взаимодействие классов
Отправлено: lit-uriy от Ноябрь 03, 2008, 18:44
в MyClass слот должен быть:
void MyClass::MySlot()
{

   AddLogString("It works fine!");

}

соеденяешь так:
connect (указатель_на_экземпляр_класса_с_сигналом, SIGNAL (MySignal()), указатель_на_экземпляр_класса_со_слотом,  SLOT (MySlot()) );

почитай справку на русском (http://crossplatform.ru/documentation/qtdoc4.3/signalsandslots.php)


Название: Re: Взаимодействие классов
Отправлено: DoZENT от Ноябрь 04, 2008, 13:22
спасибо за ссылку! но на англ языке как-то привычнее документацию читать.

Цитировать
ни хрена себе, проблема!
поэтому вопрос и находится в разделе для новичков

Цитировать
в MyClass слот должен быть:
void MyClass::MySlot()
{

   AddLogString("It works fine!");

}
сорри, опечатался, в программе все написано правильно

Цитировать
соеденяешь так:
connect (указатель_на_экземпляр_класса_с_сигналом, SIGNAL (MySignal()), указатель_на_экземпляр_класса_со_слотом,  SLOT (MySlot()) );

я вызываю

connect (m_mainServer, SIGNAL (m_mainServer->MySignal()), this,
         SLOT (MySlot()) );

из MyClass (основной класс), но все равно ничего не происходит! извините за тупость вопроса)


Название: Re: Взаимодействие классов
Отправлено: pastor от Ноябрь 04, 2008, 13:26
Нужно не так:

Код:
connect (m_mainServer, SIGNAL (m_mainServer->MySignal()), this, SLOT (MySlot()) );

а вот так:

Код:
connect (m_mainServer, SIGNAL (MySignal()), this, SLOT (MySlot()) );


Название: Re: Взаимодействие классов
Отправлено: DoZENT от Ноябрь 04, 2008, 13:46
Цитировать
а вот так:
connect (m_mainServer, SIGNAL (MySignal()), this, SLOT (MySlot()) );
спасибо!!! вот же странная эта QT, как ваш код увидел, даже не поверил, что скомпилируется, ведь MySignal по идее находится не в зоне видимости MyClass! QT, похоже, все сигналы со всех классов собирает и делает их публичными, видимыми изо всех классов программы...


Название: Re: Взаимодействие классов
Отправлено: pastor от Ноябрь 04, 2008, 14:32
спасибо!!! вот же странная эта QT, как ваш код увидел, даже не поверил, что скомпилируется, ведь MySignal по идее находится не в зоне видимости MyClass! QT, похоже, все сигналы со всех классов собирает и делает их публичными, видимыми изо всех классов программы...

Советую светаки сходить по вышеприведенной ссылке и почитать про это. Там все описано, есть примеры.

Если не понимать на русском ;), вот на английском: http://doc.trolltech.com/4.4/signalsandslots.html