Название: Не отвечает слот после отправки сигнала Отправлено: Александра от Июль 09, 2024, 10:18 Добрый день. Такая странная проблема нарисовалась: я делала сигнал и слот (как обычно это делаю) для двух файлов, но я не могу понять, почему функция слота не работает, будто вообще не вызывается. Буду благодарна, если подскажите, а то уже весь мозг сломала... Все другие сигналы и слоты с файлом Automatic работают хорошо, а тут вобще не выходит. При работе вызываемой функции должно появиться сообщение в дэбаггере, а его нет, то есть строки кода не выполняются.
Вот отрывки моего кода: automatic.cpp Код: ... database.h Код: #include <automatic.h> automatic.cpp Код: ... database.cpp Код: DataBase::DataBase(QObject *parent) : QObject(parent) Получается, что у меня вообще не вызыватся метод search_free_pallet() в классе DataBase, после того, как я посылаю сигнал take_free_pallet() в Automatic. Не знаю, как проверить, посылает от там что-то или нет (по ощущению будто нет). Название: Re: Не отвечает слот после отправки сигнала Отправлено: kambala от Июль 09, 2024, 10:55 сигнал take_free_pallet случайно не из конструктора Automatic испускается? это бы объяснило почему слот не вызывается. ну или объект automatic_wind удаляется рано. Больше проблем вроде не видно.
Цитировать Не знаю, как проверить, посылает от там что-то или нет (по ощущению будто нет). у тебя ж там есть вывод signal on automatiic — если он появляется, значит и сигнал испускается.Название: Re: Не отвечает слот после отправки сигнала Отправлено: Александра от Июль 23, 2024, 10:10 сигнал take_free_pallet случайно не из конструктора Automatic испускается? это бы объяснило почему слот не вызывается. Не, он испускается не из конструктора - там вызывается метод отдельно, где уже и инспускается сигналну или объект automatic_wind удаляется рано. Больше проблем вроде не видно. Вот тут не уверена, что удаляется, вроде объект automatic_wind не удаляется в данный момент (по крайне мере, в бэбаггере он есть..).Я пыталась разобраться сама с этим, сделала мини-приложение, которое плюс-минус напоминает механизм исходной программы (так как там уж слишком много всего...). Вот оно: https://disk.yandex.ru/d/oUMQTPvJmbbJpw Я обнаружила, что если у меня стоят коннекты в файле load, то сигнал и слот на работают, а если я его переставляю в auto, то все срабатывает без проблем. В чем тут может быть проблема? Я читала, что сигналы и слоты соединяются в определенных .h-файлах, но я ничего не смогла путного там разобрать... П.С. В самом мини-приложении суть такова: есть первая страница, по нажатии на "3" я перехожу на вторую страницу, а на второй при нажатии на "1" или "2" должен появляться свой текст, вот в тексте проблема и оказалась - он просто не появляется. При перестановке коннекта все работает правильно. Название: Re: Не отвечает слот после отправки сигнала Отправлено: kambala от Июль 23, 2024, 10:49 Цитировать вроде объект automatic_wind не удаляется в данный момент (по крайне мере, в бэбаггере он есть..) наличие в дебаггере еще не показатель. В следующем случае объект a тоже будет отображаться в дебаггере, хотя и будет иметь кривое значение:Код
залей пожалуйста код в виде zip или 7z архива, у меня нет возможности открыть rar. Про rar надо уже давно забыть и отправить на свалку истории. Название: Re: Не отвечает слот после отправки сигнала Отправлено: ssoft от Июль 23, 2024, 12:27 Потому что разные экземпляры Automat инициированы для разных переменных autw
Код
Код
Из общих замечаний - нет очистки ресурсов (RAII). Всё что создано через new "повисает в воздухе". Никто не владеет экземплярами autw и ld. Хотя бы следует сделать delete для них, подобно как delete ui. А лучше использовать unique_ptr вместо простых указателей, в нем RAII реализовано внутри, тогда и delete вызывать не нужно. Название: Re: Не отвечает слот после отправки сигнала Отправлено: Александра от Июль 23, 2024, 13:49 Потому что разные экземпляры Automat инициированы для разных переменных autw Покажусь глупой, но они же и должны быть разными, или нет..?По сути, да, они разные и друг друга не знают, потому что один в mainwindow находится, а второй - в load. Первый открывает (по сути) вторую вкладку, а второй должен заполнять текст. А если они должны быть в виде единственного экземпляра, то как это указать в двух разных файлах? Не совсем понимаю, на то ли я вообще тогда опираюсь залей пожалуйста код в виде zip или 7z архива, у меня нет возможности открыть rar. Про rar надо уже давно забыть и отправить на свалку истории. Вот, с уже исправленными на unique_ptr: https://disk.yandex.ru/d/5BjKJRV7hcyaBwНазвание: Re: Не отвечает слот после отправки сигнала Отправлено: kambala от Июль 23, 2024, 14:20 выше тебе все правильно написали. Тебе нужно передать autw в объект ld (например, как параметр конструктора), а не создавать внутри load новый объект Automat.
Название: Re: Не отвечает слот после отправки сигнала Отправлено: Александра от Июль 24, 2024, 10:28 выше тебе все правильно написали. Тебе нужно передать autw в объект ld (например, как параметр конструктора), а не создавать внутри load новый объект Automat. Ну, перенесу я таким способом autw, но у меня же load.cpp не будет знать, кто это такой. Объект ld создан и находится же в mainwindow, а коннекты же прописаны в файле load.cpp, то есть у них не будет прямой связи. Разве не так?П.с. Скорее всего, не так, но я не понимаю, как объявленный объект в конструкторе поможет объявить коннекты в другом файле. Или его надо прописывать не так, как ниже, а именно в конструкторе класса load? mainwindow.cpp Код: ... Название: Re: Не отвечает слот после отправки сигнала Отправлено: kambala от Июль 24, 2024, 11:32 Цитировать Или его надо прописывать не так, как ниже, а именно в конструкторе класса load? его надо прописать и так, как ниже, а также указать его как параметр конструктора в классе load, иначе просто будет ошибка компиляции.Код возможно тебе также понадобится сохранить autw в поле класса чтоб к нему был доступ вне конструктора load в общем, надо подучить С++ :) |