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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Странности работы connect  (Прочитано 5593 раз)
Сергей Д.
Новичок

Offline Offline

Сообщений: 17


Просмотр профиля
« : Март 13, 2023, 22:54 »

Добрый день, возникло не понимание работы механизма connect, есть connect(loadingWindow,&CreateFilter::_historyRecordLine, this, &Core::WriteHistory) но, основная проблема состоит в том что при достижения сигнала (&CreateFilter::_historyRecordLine) в инициируемом классе loadingWindow не происходит вызов слота (Core::WriteHistory) в основном родительском this классе. Ошибок в отладчике не на наблюдаться.

Цитировать
void Core::on_pushButton_2_clicked()
{
    Events* runMethods = new Events();
    if (!CreateFilter::pathFile.isEmpty() && !runMethods->IsCheckParentTreeWidget(ui->treeWidget))
    {
        CreateFilter *loadingWindow = new CreateFilter();
        //CHECK_TRUE(connect(loadingWindow,&CreateFilter::_historyRecordLine, this, &Core::WriteHistory));
        connect(loadingWindow,&CreateFilter::_historyRecordLine, this, &Core::WriteHistory);
        loadingWindow->show();
        //loadingWindow->_historyRecordLine();
        QEventLoop waitWidgetClose = QEventLoop();
        connect(loadingWindow, SIGNAL(closeSignal()), &waitWidgetClose, SLOT(quit())); //ожидает сигнала о закрытии формы
        waitWidgetClose.exec();
    }
}

Но если вызвать сигнал loadingWindow->_historyRecordLine(); из родительского класса this то все работает.

Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Март 14, 2023, 00:02 »

_historyRecordLine должен быть объявлен как
Код
C++ (Qt)
class ... {
signals: // или Q_SIGNALS
 void _historyRecordLine();
...
};

отправка сигнала через loadingWindow->_historyRecordLine() тоже выглядит неверно: должно быть
Код
C++ (Qt)
emit loadingWindow->_historyRecordLine();

а waitWidgetClose точно нужен?
Записан

Изучением 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

Сообщений: 17


Просмотр профиля
« Ответ #2 : Март 14, 2023, 00:43 »

Не несомненно оно выглядит так

Код:
public: signals:
    void closeSignal();
    void _historyRecordLine();

это пример вызова из родительского класса (хотя даже  и так работает) а из дочернего выглядит так

Код:
emit this->_historyRecordLine();
« Последнее редактирование: Март 14, 2023, 00:59 от Сергей Д. » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Март 14, 2023, 10:49 »

так тебе принципиально блокировать метод через waitWidgetClose? асинхронность никак не подходит? я думаю, что проблема сидит здесь.
Записан

Изучением 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

Сообщений: 17


Просмотр профиля
« Ответ #4 : Март 14, 2023, 21:23 »

Я то же так подумал, отключив блокировку проблема все равно осталась, но почему я могу спокойно  сигналом вызвать из родительского класса и тем же сигналом не могу вызвать из дочернего    
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Март 14, 2023, 22:44 »

в приведенном коде из родительского ты вызываешь до запуска waitWidgetClose, а из дочернего это явно происходит уже после запуска
Записан

Изучением 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

Сообщений: 17


Просмотр профиля
« Ответ #6 : Март 15, 2023, 21:33 »

Да проблемы удалось определить, в конструкторе даже поле инициализации всего класса данные сигнал не срабатывает, но после  выхода их конструктора дочернего класса, при выполнение любого события в нем он уже работает, что то я упустил где подобное было описано  Грустный 
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Март 15, 2023, 22:59 »

по идее пока не произойдет выход из конструктора, извне объект не считается созданным. хотя может это только как-то связано с мета-объектной системой Qt.
Записан

Изучением 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
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #8 : Март 16, 2023, 00:13 »

по идее пока не произойдет выход из конструктора, извне объект не считается созданным. хотя может это только как-то связано с мета-объектной системой Qt.
Это не с "мета-объектной системой Qt" связано, а со здравым смыслом. При конструирования объекта он ведь может быть и "не достроен". Допустим, памяти не хватило. Понятно, что "извне" объект либо создан полностью, либо не создан вообще.
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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