Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Yegor от Март 30, 2015, 21:34



Название: [РЕШЕНО] QObject::connect и Qt::UniqueConnection - ошибка
Отправлено: 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
Думаю, у кого-то еще возникала такая ошибка.

Подскажите, пожалуйста, что я делаю не так.


Название: Re: QObject::connect и Qt::UniqueConnection - ошибка
Отправлено: System от Март 30, 2015, 22:35
Код
C++ (Qt)
static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection);
 


Название: Re: QObject::connect и Qt::UniqueConnection - ошибка
Отправлено: kibsoft от Март 30, 2015, 22:53
По логике, если вам не нужен тип
Код:
Qt::BlockingQueuedConnection
, тогда достаточно указать только
Код:
Qt::UniqueConnection
, т.к. в этом случае будет
Код:
Qt::AutoConnection
, что приведет все к тому же
Код:
Qt::QueuedConnection | Qt::UniqueConnection
, потому что sender и receiver у вас в разных потоках.

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


Название: Re: QObject::connect и Qt::UniqueConnection - ошибка
Отправлено: Yegor от Март 31, 2015, 10:32
У меня выдает ошибку, когда я пытаюсь комбинировать Qt::UniqueConnection с любым другим типом. Является ли единственным правильным выходом
Цитировать
static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection);
?

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

И еще меня интересует вопрос: если соединения сделать Qt::AutoConnection. А затем, уже после этого соединения, объекты перемещаются то в один, то в разные потоки, будет ли меняться автоматически тип уже ранее созданного подключения? То есть меняться между Qt::AutoConnection и Qt::QueuedConnection?


Название: Re: QObject::connect и Qt::UniqueConnection - ошибка
Отправлено: System от Март 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, который на стадии компиляции заорёт, если сочтёт преобразование неверным.


Название: Re: QObject::connect и Qt::UniqueConnection - ошибка
Отправлено: Авварон от Март 31, 2015, 12:32
Первое тупо преобразует в Qt::ConnectionType, даже не пытаясь проверить возможность преобразования. Это так называемое преобразование в стиле C. Второе делает то же самое, но в стиле C++. Самое правильное - static_cast, который на стадии компиляции заорёт, если сочтёт преобразование неверным.

Код:
Qt::ConnectionType(Qt::QueuedConnection | Qt::UniqueConnection);


Название: Re: QObject::connect и Qt::UniqueConnection - ошибка
Отправлено: qate от Март 31, 2015, 14:19
Мне нужен именно Qt::QueuedConnection указанный явно. Так как при выполнении программы объект высылающий сигнал, и объект-получатель могут находиться то в одном, то в разных потоках.

как это объекты бегает между потоками, интересно зачем ?


Название: Re: [РЕШЕНО] QObject::connect и Qt::UniqueConnection - ошибка
Отправлено: Yegor от Март 31, 2015, 15:18
Спасибо большое всем за полезные ответы! Проблема решена.