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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не вызываются слоты  (Прочитано 8403 раз)
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.
Записан
ритт
Гость
« Ответ #1 : Февраль 06, 2008, 16:20 »

выглядит корректно...
логиндиалог - наследник кудиалога? в каком месте логиндиалог выполняется?
попробуй ещё вот это: http://qt4.digitalfanatics.org/articles/signalspy.html
Записан
finka
Гость
« Ответ #2 : Февраль 06, 2008, 18:20 »

Да, наследник от QDialog.
Код:
   privateDialog = new LoginDialog;
   if (connect(privateDialog, SIGNAL(accepted()), this, SLOT(temp())))
   {
      ...
   }
   privateDialog->show();
Ссылку щас посмотрю.
Записан
Sergey B.
Программист
*****
Offline Offline

Сообщений: 544



Просмотр профиля WWW
« Ответ #3 : Февраль 06, 2008, 19:45 »

if (connect(privateDialog, SIGNAL(accepted()), this, SLOT(temp())))

Что возвращает connect?
Записан
finka
Гость
« Ответ #4 : Февраль 07, 2008, 11:04 »

Sergey B. , возвращает 1.
Записан
Karl-Philipp
Гость
« Ответ #5 : Февраль 07, 2008, 15:08 »

Если условие выполнятся, то скорее всего проблема внутри слота. Посмотрите, работает ли слот сам по себе?
Записан
finka
Гость
« Ответ #6 : Февраль 08, 2008, 18:58 »

terlan, работает.
Записан
finka
Гость
« Ответ #7 : Февраль 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*
« Последнее редактирование: Февраль 08, 2008, 20:06 от finka » Записан
BRE
Гость
« Ответ #8 : Февраль 08, 2008, 20:13 »

Без обид. Это проблемы со знанием C++.
Hint: Объект moduleManager или не создается вовсе или разрушается перед app.exec().
Не знаю, чего ты хочешь добиться, но обрати на это внимание.  Подмигивающий
Записан
finka
Гость
« Ответ #9 : Февраль 08, 2008, 20:26 »

Упс! Слона-то я и не приметил  Смеющийся
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #10 : Февраль 08, 2008, 23:08 »

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

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

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
finka
Гость
« Ответ #11 : Февраль 08, 2008, 23:34 »

pastor, я засунула exec() в скобки после условия, и все заработало:) Так как указателю loginDialog (и, кстати, всем остальным объектам, с помощью которых впоследствии проверяла коннекты) я выделяла память через new, то он и не удалялся с удалением ModuleManager. Поэтому все мои объекты друг с другом коннектились, а с ModuleManager'ом не хотели.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #12 : Февраль 09, 2008, 02:02 »

Упс )) Я тоже этого же слона и не заметил ))))

2 BRE: Сорри, был не прав Улыбающийся
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Dodge
Гость
« Ответ #13 : Февраль 11, 2008, 16:58 »

Междупрочим, уже второй раз замечаю подобную ошибку у людей с нашего ворума... сразу видно, кто НЕ дети vcl'я )))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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