Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Сергей Д. от Март 13, 2023, 22:54



Название: Странности работы connect
Отправлено: Сергей Д. от Март 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 то все работает.



Название: Re: Странности работы connect
Отправлено: kambala от Март 14, 2023, 00:02
_historyRecordLine должен быть объявлен как
Код
C++ (Qt)
class ... {
signals: // или Q_SIGNALS
 void _historyRecordLine();
...
};

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

а waitWidgetClose точно нужен?


Название: Re: Странности работы connect
Отправлено: Сергей Д. от Март 14, 2023, 00:43
Не несомненно оно выглядит так

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

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

Код:
emit this->_historyRecordLine();


Название: Re: Странности работы connect
Отправлено: kambala от Март 14, 2023, 10:49
так тебе принципиально блокировать метод через waitWidgetClose? асинхронность никак не подходит? я думаю, что проблема сидит здесь.


Название: Re: Странности работы connect
Отправлено: Сергей Д. от Март 14, 2023, 21:23
Я то же так подумал, отключив блокировку проблема все равно осталась, но почему я могу спокойно  сигналом вызвать из родительского класса и тем же сигналом не могу вызвать из дочернего    


Название: Re: Странности работы connect
Отправлено: kambala от Март 14, 2023, 22:44
в приведенном коде из родительского ты вызываешь до запуска waitWidgetClose, а из дочернего это явно происходит уже после запуска


Название: Re: Странности работы connect
Отправлено: Сергей Д. от Март 15, 2023, 21:33
Да проблемы удалось определить, в конструкторе даже поле инициализации всего класса данные сигнал не срабатывает, но после  выхода их конструктора дочернего класса, при выполнение любого события в нем он уже работает, что то я упустил где подобное было описано  :( 


Название: Re: Странности работы connect
Отправлено: kambala от Март 15, 2023, 22:59
по идее пока не произойдет выход из конструктора, извне объект не считается созданным. хотя может это только как-то связано с мета-объектной системой Qt.


Название: Re: Странности работы connect
Отправлено: tux от Март 16, 2023, 00:13
по идее пока не произойдет выход из конструктора, извне объект не считается созданным. хотя может это только как-то связано с мета-объектной системой Qt.
Это не с "мета-объектной системой Qt" связано, а со здравым смыслом. При конструирования объекта он ведь может быть и "не достроен". Допустим, памяти не хватило. Понятно, что "извне" объект либо создан полностью, либо не создан вообще.