Russian Qt Forum
Июня 03, 2025, 11:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не вызываются слоты  (Прочитано 8608 раз)
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]   Вверх
  Печать  
 
Перейти в:  


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