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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] QObject::connect и Qt::UniqueConnection - ошибка  (Прочитано 6086 раз)
Yegor
Гость
« : Март 30, 2015, 21:34 »

Здравствуйте, уважаемые форумчане!

Использую:
Qt 5.4.0
компилятор: mingw 4.9.1 32bit
OS: Windows 7

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

По логике, для этого нужно в методе connect, в конечном аргументе прописать:
Код:
Qt::QueuedConnection | Qt::UniqueConnection

Но у меня при компиляции с такой такой формой записи возникает ошибка:
Цитировать
error: invalid conversion from 'int' to 'Qt::ConnectionType' [-fpermissive]

А если сделать
Код:
Qt::UniqueConnection
одним, без комбинации с другими типами соединения - все компилируется
То есть элемент перечисления
Код:
Qt::UniqueConnection
не хочет комбинироваться с другими типами подключений, с помощью побитового ИЛИ.
Хотя в assistant пишеться, что:

Цитировать
This is a flag that can be combined with any one of the above connection types, using a bitwise OR. When Qt::UniqueConnection is set, QObject::connect() will fail if the connection already exists (i.e. if the same signal is already connected to the same slot for the same pair of objects). This flag was introduced in Qt 4.6.

А мне нужно именно
Код:
Qt::QueuedConnection | Qt::UniqueConnection
Думаю, у кого-то еще возникала такая ошибка.

Подскажите, пожалуйста, что я делаю не так.
« Последнее редактирование: Март 31, 2015, 15:18 от Yegor » Записан
System
Гость
« Ответ #1 : Март 30, 2015, 22:35 »

Код
C++ (Qt)
static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection);
 
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #2 : Март 30, 2015, 22:53 »

По логике, если вам не нужен тип
Код:
Qt::BlockingQueuedConnection
, тогда достаточно указать только
Код:
Qt::UniqueConnection
, т.к. в этом случае будет
Код:
Qt::AutoConnection
, что приведет все к тому же
Код:
Qt::QueuedConnection | Qt::UniqueConnection
, потому что sender и receiver у вас в разных потоках.

P.S. Если не так, прошу исправить.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Yegor
Гость
« Ответ #3 : Март 31, 2015, 10:32 »

У меня выдает ошибку, когда я пытаюсь комбинировать Qt::UniqueConnection с любым другим типом. Является ли единственным правильным выходом
Цитировать
static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection);
?

Мне нужен именно Qt::QueuedConnection указанный явно. Так как при выполнении программы объект высылающий сигнал, и объект-получатель могут находиться то в одном, то в разных потоках.

И еще меня интересует вопрос: если соединения сделать Qt::AutoConnection. А затем, уже после этого соединения, объекты перемещаются то в один, то в разные потоки, будет ли меняться автоматически тип уже ранее созданного подключения? То есть меняться между Qt::AutoConnection и Qt::QueuedConnection?
« Последнее редактирование: Март 31, 2015, 10:42 от Yegor » Записан
System
Гость
« Ответ #4 : Март 31, 2015, 12:30 »

У меня выдает ошибку, когда я пытаюсь комбинировать Qt::UniqueConnection с любым другим типом.
Вероятно, всё же не типом, а значением перечисления Qt::ConnectionType. Правильно выдаёт ошибку. Почитайте что-нибудь относительно перечислений в C/C++ и неявном преобразовании их типов. Если упрощённо, то при арифметических и побитовых операциях перечисления преобразуются к целому типу, но обратное приведение типов автоматически не выполняется.

Является ли единственным правильным выходом
Цитировать
static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection);
?
Да. Это единственный правильный выход. Можно ещё предложить парочку неправильных:
Код
C++ (Qt)
(Qt::ConnectionType)(Qt::QueuedConnection | Qt::UniqueConnection);
reinterpret_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection);
 
Первое тупо преобразует в Qt::ConnectionType, даже не пытаясь проверить возможность преобразования. Это так называемое преобразование в стиле C. Второе делает то же самое, но в стиле C++. Самое правильное - static_cast, который на стадии компиляции заорёт, если сочтёт преобразование неверным.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #5 : Март 31, 2015, 12:32 »

Первое тупо преобразует в Qt::ConnectionType, даже не пытаясь проверить возможность преобразования. Это так называемое преобразование в стиле C. Второе делает то же самое, но в стиле C++. Самое правильное - static_cast, который на стадии компиляции заорёт, если сочтёт преобразование неверным.

Код:
Qt::ConnectionType(Qt::QueuedConnection | Qt::UniqueConnection);
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #6 : Март 31, 2015, 14:19 »

Мне нужен именно Qt::QueuedConnection указанный явно. Так как при выполнении программы объект высылающий сигнал, и объект-получатель могут находиться то в одном, то в разных потоках.

как это объекты бегает между потоками, интересно зачем ?
Записан
Yegor
Гость
« Ответ #7 : Март 31, 2015, 15:18 »

Спасибо большое всем за полезные ответы! Проблема решена.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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