Qt: указание нескольких типов соединений с QObject:: connect
Я хотел бы знать, можно ли указать несколько типов соединений. Например, я хочу, чтобы мой тип соединения был подключением в очереди и уникальным соединением. Можно ли указать в одном заявлении ?
QObject::connect(ptrSender,SIGNAL(..),ptrReceiver,SLOT(...),Queued-and-unique)
обновление :
следуя предложению плакатов:
Я попытался с помощью Qt::QueuedConnection | Qt::UniqueConnection
но я
`Error 1 error C2664: 'QMetaObject::Connection QObject::connect(const QObject *,const char *,const QObject *,const char *,Qt::ConnectionType)' : cannot convert parameter 5 from 'int' to 'Qt::ConnectionType'
3 ответов
можно ли указать в одном заявлении ?
теоретически, это кажется возможным для вашего сценария. По крайней мере, вы можете читать документы документация об этом.
Qt:: UniqueConnection 0x80 это флаг, который можно комбинировать с любым из вышеперечисленных типов соединений, используя побитовое или. Когда Qt::UniqueConnection установлен, QObject::connect() потерпит неудачу, если соединение уже существует (т. е. если то же самое сигнал уже подключен к тому же слоту для той же пары объектов). Этот флаг был введен в Qt 4.6.
основываясь на вышеупомянутой документации, вы напишете что-то вроде этого:
#include <QCoreApplication>
int main(int argc, char **argv)
{
QCoreApplication coreApplication(argc, argv);
QObject::connect(&coreApplication, SIGNAL(aboutToQuit()), &coreApplication, SLOT(quit()), static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection));
return coreApplication.exec();
}
вполне возможно, но C++ предотвращает передачу или так, как вы это делаете.
проблема в том, что connect
принимает аргумент типа Qt::ConnectionType
. побитовое OR'ING два значения из перечисления производит значение типа int
(значения перечисления проходят продвижение целого числа для применения побитового оператора OR). Это вызывает ошибку компиляции, которую вы получаете:
не удается преобразовать параметр 5 из 'int' для 'Qt:: ConnectionType'
(помните, что в C++ интегралы не преобразуются автоматически в перечисления).
таким образом, решение отбрасывает результат OR в правильный тип, а правильный бросок для использования -static_cast
:
static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection)
теперь вы можете спросить: "почему авторы Qt не думали об этом"? Ну, дело в том, что Qt::UniqueConnection
добавлено в Qt 4.6.
перед тем, connect
только взял одно перечисление ценность, а не их сочетание. Вот почему connect
это подпись:
connect(..., Qt::ConnectionType)
, а не что-то вроде этого:
connect(..., QFlags<Qt::ConnectionType>)
connect(..., int)
которые бы позволили или. (Обратите внимание, что эти последние две подписи также допускают такие вещи, как Qt::DirectConnection | Qt::QueuedConnection
, что не имеет смысла).
конечно, это возможно. Потому что Qt::UniqueConnection
- Это флаг, который можно комбинировать с любым из других типов соединений, используя побитовое или.
QObject::connect(ptrSender,SIGNAL(..),ptrReceiver,SLOT(...), Qt::UniqueConnection | Qt::QueuedConnection);
проверка документации: тип соединения
в Qt 4.8 В. Qt::UniqueConnection
также имеет значение 0x80, что позволяет комбинировать его с другими типами соединений.