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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не отвечает слот после отправки сигнала  (Прочитано 3866 раз)
Александра
Новичок

Offline Offline

Сообщений: 5


Просмотр профиля
« : Июль 09, 2024, 10:18 »

Добрый день. Такая странная проблема нарисовалась: я делала сигнал и слот (как обычно это делаю) для двух файлов, но я не могу понять, почему функция слота не работает, будто вообще не вызывается. Буду благодарна, если подскажите, а то уже весь мозг сломала... Все другие сигналы и слоты с файлом Automatic работают хорошо, а тут вобще не выходит. При работе вызываемой функции должно появиться сообщение в дэбаггере, а его нет, то есть строки кода не выполняются.
Вот отрывки моего кода:

automatic.cpp
Код:
...
public slots:
    void free_pallet(QVector<int> to_free_pallet);
 
signals:
    void take_free_pallet();    //сигнал базе данных на считывание свободных мест


database.h
Код:
#include <automatic.h>
...
private:
    Automatic *automatic_wind;
 
signals:
    void send_free_pallet(QVector<int>);
 
public slots:
    void search_free_pallet();


automatic.cpp
Код:
...
    //проверка:
    emit take_free_pallet();
    qDebug()<<"signal on automatiic";
...


database.cpp
Код:
DataBase::DataBase(QObject *parent) : QObject(parent)
{
    qDebug()<<"it work";
 
    automatic_wind = new Automatic();
    connect(automatic_wind,&Automatic::take_free_pallet,this,&DataBase::search_free_pallet);
    connect(this,&DataBase::send_free_pallet,automatic_wind,&Automatic::free_pallet);
}
...
void DataBase::search_free_pallet(){
    qDebug()<<"search";
    QVector <int> number_pallet;
    QSqlQuery *query = nullptr;
    ...
    emit send_free_pallet(number_pallet);
    qDebug()<<"signal on database";
}

Получается, что у меня вообще не вызыватся метод search_free_pallet() в классе DataBase, после того, как я посылаю сигнал take_free_pallet() в Automatic. Не знаю, как проверить, посылает от там что-то или нет (по ощущению будто нет).
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Июль 09, 2024, 10:55 »

сигнал take_free_pallet случайно не из конструктора Automatic испускается? это бы объяснило почему слот не вызывается. ну или объект automatic_wind удаляется рано. Больше проблем вроде не видно.
Цитировать
Не знаю, как проверить, посылает от там что-то или нет (по ощущению будто нет).
у тебя ж там есть вывод signal on automatiic — если он появляется, значит и сигнал испускается.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Александра
Новичок

Offline Offline

Сообщений: 5


Просмотр профиля
« Ответ #2 : Июль 23, 2024, 10:10 »

сигнал take_free_pallet случайно не из конструктора Automatic испускается? это бы объяснило почему слот не вызывается.
Не, он испускается не из конструктора - там вызывается метод отдельно, где уже и инспускается сигнал

ну или объект automatic_wind удаляется рано. Больше проблем вроде не видно.
Вот тут не уверена, что удаляется, вроде объект automatic_wind не удаляется в данный момент (по крайне мере, в бэбаггере он есть..).

Я пыталась разобраться сама с этим, сделала мини-приложение, которое плюс-минус напоминает механизм исходной программы (так как там уж слишком много всего...).
Вот оно: https://disk.yandex.ru/d/oUMQTPvJmbbJpw
Я обнаружила, что если у меня стоят коннекты в файле load, то сигнал и слот на работают, а если я его переставляю в auto, то все срабатывает без проблем. В чем тут может быть проблема? Я читала, что сигналы и слоты соединяются в определенных .h-файлах, но я ничего не смогла путного там разобрать...

П.С. В самом мини-приложении суть такова: есть первая страница, по нажатии на "3" я перехожу на вторую страницу, а на второй при нажатии на "1" или "2" должен появляться свой текст, вот в тексте проблема и оказалась - он просто не появляется. При перестановке коннекта все работает правильно.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Июль 23, 2024, 10:49 »

Цитировать
вроде объект automatic_wind не удаляется в данный момент (по крайне мере, в бэбаггере он есть..)
наличие в дебаггере еще не показатель. В следующем случае объект a тоже будет отображаться в дебаггере, хотя и будет иметь кривое значение:
Код
C++ (Qt)
auto a = new A;
delete a;
std::cout << ''; // поставим тут точку останова

залей пожалуйста код в виде zip или 7z архива, у меня нет возможности открыть rar. Про rar надо уже давно забыть и отправить на свалку истории.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #4 : Июль 23, 2024, 12:27 »

Потому что разные экземпляры Automat инициированы для разных переменных autw

Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent)
   , ui(new Ui::MainWindow)
{
   ui->setupUi(this);
 
   autw = new Automat();
   connect(this,&MainWindow::open_window,autw,&Automat::open_automat);
 
   ld=new load();
}
 

Код
C++ (Qt)
load::load(QObject *parent) : QObject(parent)
{
   autw = new Automat();
   connect(autw,&Automat::get_load,this,&load::load_data);
   connect(this,&load::get_data,autw,&Automat::load_text);
 
}
 


Из общих замечаний - нет очистки ресурсов (RAII). Всё что создано через new "повисает в воздухе".
Никто не владеет экземплярами autw и ld. Хотя бы следует сделать delete для них, подобно как delete ui.
А лучше использовать unique_ptr вместо простых указателей, в нем RAII реализовано внутри, тогда и delete вызывать не нужно.
Записан
Александра
Новичок

Offline Offline

Сообщений: 5


Просмотр профиля
« Ответ #5 : Июль 23, 2024, 13:49 »

Потому что разные экземпляры Automat инициированы для разных переменных autw
Покажусь глупой, но они же и должны быть разными, или нет..?
По сути, да, они разные и друг друга не знают, потому что один в mainwindow находится, а второй - в load. Первый открывает (по сути) вторую вкладку, а второй должен заполнять текст.
А если они должны быть в виде единственного экземпляра, то как это указать в двух разных файлах? Не совсем понимаю, на то ли я вообще тогда опираюсь
 
залей пожалуйста код в виде zip или 7z архива, у меня нет возможности открыть rar. Про rar надо уже давно забыть и отправить на свалку истории.
Вот, с уже исправленными на unique_ptr: https://disk.yandex.ru/d/5BjKJRV7hcyaBw
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Июль 23, 2024, 14:20 »

выше тебе все правильно написали. Тебе нужно передать autw в объект ld (например, как параметр конструктора), а не создавать внутри load новый объект Automat.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Александра
Новичок

Offline Offline

Сообщений: 5


Просмотр профиля
« Ответ #7 : Июль 24, 2024, 10:28 »

выше тебе все правильно написали. Тебе нужно передать autw в объект ld (например, как параметр конструктора), а не создавать внутри load новый объект Automat.
Ну, перенесу я таким способом autw, но у меня же load.cpp не будет знать, кто это такой. Объект ld создан и находится же в mainwindow, а коннекты же прописаны в файле load.cpp, то есть у них не будет прямой связи. Разве не так?
П.с. Скорее всего, не так, но я не понимаю, как объявленный объект в конструкторе поможет объявить коннекты в другом файле. Или его надо прописывать не так, как ниже, а именно в конструкторе класса load?
mainwindow.cpp
Код:
...
autw = std::make_unique<Automat>();
ld = std::make_unique<load>(autw);
...
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Июль 24, 2024, 11:32 »

Цитировать
Или его надо прописывать не так, как ниже, а именно в конструкторе класса load?
его надо прописать и так, как ниже, а также указать его как параметр конструктора в классе load, иначе просто будет ошибка компиляции.
Код
C++ (Qt)
load::load(Automat *autw, QObject *parent) : QObject(parent)
{
   connect(autw, &Automat::get_load, this, &load::load_data);
 
   // альтернативно: вместо этого connect и emit get_data() просто писать autw->load_text() в месте испускания сигнала
   connect(this, &load::get_data, autw, &Automat::load_text);
}
возможно тебе также понадобится сохранить autw в поле класса чтоб к нему был доступ вне конструктора load

в общем, надо подучить С++ Улыбающийся
« Последнее редактирование: Июль 24, 2024, 11:34 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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