Передача сигнала в функцию
Привет. Можно ли передать в метод сигнал, как параметр и потом сделать коннект на него? код ниже конечно не работает.
_model->waitingFor(SIGNAL(Model::somesignal())); // no matching function for call to.. ... class Model : public QObject { Q_OBJECT public: explicit Model(QObject *parent = nullptr); void foo(); void waitingFor(const char *signal); - не работает // void waitingFor(std::function<void()> &signal); - тоже не работает signals: void somesignal(); }; ... void Model::waitingFor(const char *signal) { QEventLoop evloop; connect(this, signal, &evloop, &QEventLoop::quit); // не соберется connect(this, SIGNAL(signal()), &evloop, SLOT(quit())); // соберется, но QObject::connect: No such signal Model::signal() evloop.exec(); }
*так тоже не работает
void Test::waitingFor2(std::function<QMetaMethod> &signal) { QEventLoop evloop; connect(this, signal, &evloop, &QEventLoop::quit); evloop.exec(); }
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
B
- Bogdannn
- March 27, 2024, 7:15 p.m.
C++ - Test 001. The first program and data types
- Result:46points,
- Rating points-6
Last comments
Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Анатолий КононенкоFeb. 5, 2024, 1:50 a.m.
EVADec. 25, 2023, 10:30 a.m.
Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Now discuss on the forum
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
Павел ДорофеевApril 14, 2024, 2:35 a.m.
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
Как получить в массив значения из связанной модели? Спасибо, разобрался:))
AC
QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
Alexandru CodreanuJan. 19, 2024, 11:57 a.m.
Добрый день.
Можно передать сигнал, но лучше в виде указателей это всё делать, МАКРОСЫ следует изживать из проекта.
Также здесь следует использовать шаблоны. Конкретно ваш случай можно разрулить так
И вызов метода
великолепно. я уж начал сомневаться, что делаю решаемую задачу.
На макросах тоже можно, но лучше не надо. Кода больше получается, сам код в случае макросов требует применения SFINAE - в общем красивым код не назовёшь. Да и макросы менее надёжны.
на работе просто собрал, а протестил вот сейчас дома- не отрабатывает коннект.
именно qDebug() << "signal received";
Может нельзя передавать в метод сигнал, а потом соединяться с ним?
я вот думаю, что всё же правильней передавать const char *. Но всё равно тишина...
qDebug() << "mainwindow"; не отработает.
Вы неправильно думаете. При компиляции проектов на C/C++ макросы разворачиваются в полноценный код, а в случае Qt присутствует ещё и этап создания moc файлов, в которых эти макросы уже интерпретируются в сигнатуры функций и создаётся код коннектов. И только потом уже происходит компиляция всех созданных исходников. В Qt не создаются налёту подключения сигналов и слотов из указателей на const char *, потому что SIGNAL и SLOT - это не строки, это макросы. Весь процесс создания кода в случае SIGNAL и SLOT для сигналов и слотов происходит на этапе ПРЕДКОМПИЛЯЦИИ, а не в рантайме. А то, что вы пытаетесь передавать указатель на const char - это рантайм.
Я вам дал полностью рабочий пример кода, который оттестировал и запустил.
Вот модифицированный вариант, который тоже работает.
Вот так его можно использовать
widget.h
widget.cpp
Вот тестовый проект
CheckSignals.zip