Проброс std::array<qint32, SIZE> с помощью сигнала по ссылке
qt, std::array, signal, Slot
Всем привет!
Хочу с помощью сигнала пробросить в слот массив std::array.
Делаю следующее:
using fft_mag_arr= std::array<qint32, SIZE>; Q_DECLARE_METATYPE( fft_mag_arr );
в конструкторе класса вызываю
qRegisterMetaType<fft_mag_arr>();
само объявление сигнала:
signals: void fft_mag_out(fft_mag_arr &fftmag, uint size);
Слот объявлен так (так можно в данном случае, если в сигнале fft_mag_arr?)
void slotFunc(std::array<qint32, SIZE> &arr, uint size);
При запуске приложения при вызове сигнала пишет:
QObject::connect: Cannot queue arguments of type 'fft_mag_arr&' (Make shure 'fft_mag_arr&') is registered using qRegisterMetaType().
Как мне пробросить ссылку на std::array с помощью сигнала?
Спасибо
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!
Пікірлер
- Akiv Doros
- Қар. 11, 2024, 2:58 Т.Қ.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:50ұпай,
- Бағалау ұпайлары-4
- molni99
- Қаз. 26, 2024, 1:37 Т.Ж.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:80ұпай,
- Бағалау ұпайлары4
- molni99
- Қаз. 26, 2024, 1:29 Т.Ж.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:20ұпай,
- Бағалау ұпайлары-10
Добрый день
Тут скорее регистрация мета типа не полная. Нет его имени.
Напишите так
Попробовал, но не помогло.
Ну не знаю, кое-где на форумах встречается вариант с typedef вместо using
А вообще вполне закономерный вопрос, а зачем вам qRegisterMetaType? Слоты и сигналы и так работают с ссылками на std::vector без всякой метамагии.
Так должно работать,
Да и так тоже
Там qRegisterMetaType ни к чему по сути, это нужно для работы QVariant, да регистрации в QML. И ещё ряда более редких случаев.
typedef тоже не помог.
Я сначала и написал все без qRegisterMetaType. Но начало вылетать предупреждение. Пришлось вставить.
Какое предупреждение? Предупреждение - это не ошибка. Если вам статический анализ в Qt Creator что-то показывает, то это не значит, что это руководство к действию.
В Qt Creator используется статический анализатор clang, который ничего не знает о сигналах и слотах в полной мере.
Добрый день. Вопрос, может не совсем в тему. А зачем вы используете такой контейнер? Передавать контейнер со статическим размером через сигнал/слот мне кажется не очень удобным.
Я, конечно, понимаю, что вы его через дефайн заносите, но всё равно вам значит в разные классы заголовочный файл с этим дефайном тащить приходится.
Если вы за память переживаете - можно взять вектор (std::vector или QVector) и зарезервировать под него память и передавать его размер через отдельную переменную, как у вас и сделано.
Может после этого и все проблемы решатся. И не нужно будет с этой ошибкой биться.
Хотя, возможно, у вас какая-то логика, которую я не вижу, которая требует именно такой тип контейнера.
Дело в том, что слот не вызывается.
Лучше действительно сделайте через вектор с выделением заранее заданного размера памяти, как Александр посоветовал, и тогда всё заработает.
Иначе так слишком переусложните логику на ровном месте.
Тут мне код достался написанный. Объявляется обычный массив и в сигнале кидается указатель на него, а в слоте уже пробегаются по этому массиву. Хотлось бы избавиться от этого и по ссылке передавать массив. Но, может, я и зря пытаюсь все привести на более высокий уровень. А так да, можно и вектор использовать.
Если там не настолько критично потребление памяти. То есть если это Desktop, а не встраиваемое решение или какой-нибудь игровой/графический движок. То проще будет на вектор переписать. Меньше головной боли.
ПО работает на малине. Попробовал сделать отдельный проект с парой классов. Один емитит вектор, второй его принимает. Все работает. На компе установлена 5.12.1. На малине Qt 5.3.2 как выяснилось. Не может же быть бага в Qt?
Дело еще в том, что сигнал с массивом емитится из другого потока, в котором запущен таймер, по таймауту которого и емитится массив. Врядли это с потоками связано?
Проблему решил. Попробовал вектор по ссылке передавать, но ошибка была та же. Передача вектора в сигнале по константной ссылке решила проблему. Все работает и без qRegisterMetaType. Похоже, что это из-за того, что сигнал и слот в разных потоках.
Скорее всего. Вам бы на всякий случай ещё и мюьтексами в слоте закрываться, если не сделано это
Да, мьютекс добавил, но в том потоке, где сигнал вызывается.