Russian Qt Forum

Qt => Общие вопросы => Тема начата: finka от Февраль 06, 2008, 14:04



Название: Не вызываются слоты
Отправлено: finka от Февраль 06, 2008, 14:04
Вот у меня есть класс

Код:
#include "logindialog.h"
class ModuleManager : public QObject
{
   Q_OBJECT
   
   LoginDialog * privateDialog;
   ...
   public slots:
   void temp();
};

ModuleManager::ModuleManager()
:QObject()
{
   ...
   privateDialog = new LoginDialog;
   if (connect(privateDialog, SIGNAL(accepted()), this, SLOT(temp())))
   {
      ...
   }
}

connect возвращает 1, но слот temp() напрочь отказывается выполняться. Пробовала другие слоты класса ModuleManager - не выполняются, пробовала

connect(privateDialog, SIGNAL(accepted()), privateDialog, SLOT(deleteLater()))

privateDialog удаляется, то есть сигнал accepted() срабатывает. Почему это может происходить?

Qt 4.3.1, XP, vs2005.


Название: Re: Не вызываются слоты
Отправлено: ритт от Февраль 06, 2008, 16:20
выглядит корректно...
логиндиалог - наследник кудиалога? в каком месте логиндиалог выполняется?
попробуй ещё вот это: http://qt4.digitalfanatics.org/articles/signalspy.html


Название: Re: Не вызываются слоты
Отправлено: finka от Февраль 06, 2008, 18:20
Да, наследник от QDialog.
Код:
   privateDialog = new LoginDialog;
   if (connect(privateDialog, SIGNAL(accepted()), this, SLOT(temp())))
   {
      ...
   }
   privateDialog->show();
Ссылку щас посмотрю.


Название: Re: Не вызываются слоты
Отправлено: Sergey B. от Февраль 06, 2008, 19:45
if (connect(privateDialog, SIGNAL(accepted()), this, SLOT(temp())))

Что возвращает connect?


Название: Re: Не вызываются слоты
Отправлено: finka от Февраль 07, 2008, 11:04
Sergey B. , возвращает 1.


Название: Re: Не вызываются слоты
Отправлено: Karl-Philipp от Февраль 07, 2008, 15:08
Если условие выполнятся, то скорее всего проблема внутри слота. Посмотрите, работает ли слот сам по себе?


Название: Re: Не вызываются слоты
Отправлено: finka от Февраль 08, 2008, 18:58
terlan, работает.


Название: Re: Не вызываются слоты
Отправлено: finka от Февраль 08, 2008, 19:48
Вот main, может тут че-то не то:
Код:
int main (int argc, char **argv)
{

    QApplication app(argc, argv);

    if (argc > 1)
    {
        ModuleManager moduleManager(argv[1]);
    }
    return app.exec();
}

Все слоты ModuleManager по отдельности вызываются, но при коннекте отказываются реагировать на любые сигналы любых классов (я попробовала, правда, только 2, но и так понятно), кроме своих собственных.
Если какой-нибудь сигнал ModuleManager соединить со слотом другого класса, например, loginDialog (но я и не только его пробовала), то при emit этого сигнала, нужный слот вызывается. Прям какая-то slotовая дискриминация по каким-то признакам ???  :'( *тут смайлик help*


Название: Re: Не вызываются слоты
Отправлено: BRE от Февраль 08, 2008, 20:13
Без обид. Это проблемы со знанием C++.
Hint: Объект moduleManager или не создается вовсе или разрушается перед app.exec().
Не знаю, чего ты хочешь добиться, но обрати на это внимание.  ;)


Название: Re: Не вызываются слоты
Отправлено: finka от Февраль 08, 2008, 20:26
Упс! Слона-то я и не приметил  ;D


Название: Re: Не вызываются слоты
Отправлено: pastor от Февраль 08, 2008, 23:08
Без обид. Это проблемы со знанием C++.
Hint: Объект moduleManager или не создается вовсе или разрушается перед app.exec().
Не знаю, чего ты хочешь добиться, но обрати на это внимание.  ;)

Судя из предыдущих постов объект moduleManager создаеться, так как privateDialog диалог отображаеться. Из преведенного кода я невижу причин удаления объекта moduleManager

2  finka:  Я сделал подобный экзампл, проблем никаких нет (Qt 4.3.3). Ты можешь запостить полный код, чтобы я проверил у себя?


Название: Re: Не вызываются слоты
Отправлено: finka от Февраль 08, 2008, 23:34
pastor, я засунула exec() в скобки после условия, и все заработало:) Так как указателю loginDialog (и, кстати, всем остальным объектам, с помощью которых впоследствии проверяла коннекты) я выделяла память через new, то он и не удалялся с удалением ModuleManager. Поэтому все мои объекты друг с другом коннектились, а с ModuleManager'ом не хотели.


Название: Re: Не вызываются слоты
Отправлено: pastor от Февраль 09, 2008, 02:02
Упс )) Я тоже этого же слона и не заметил ))))

2 BRE: Сорри, был не прав :)


Название: Re: Не вызываются слоты
Отправлено: Dodge от Февраль 11, 2008, 16:58
Междупрочим, уже второй раз замечаю подобную ошибку у людей с нашего ворума... сразу видно, кто НЕ дети vcl'я )))