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, что позволяет комбинировать его с другими типами соединений.