Вызов метода с массивом или аргументами с использованием QueuedConnection - PullRequest
0 голосов
/ 03 октября 2011

Я хочу вызвать произвольный слот QObject в другом потоке.

У меня есть:

                           |  Arguments:    | Can use QueuedConnection?
QMetaObject::invokeMethod  |  fixed number  | YES
qt_metacall                |  array         | NO

Я хочу:

<something>                |  array         | YES

Я не хочу делать такие вещи, как дублирование кода invokeMethod на основе количества аргументов.

Где взять invokeMethod, который принимает массив аргументов или как сделать qt_metacall в очереди?

Ответы [ 2 ]

0 голосов
/ 04 октября 2011

Обход, создав массив, инициализированный GenericArgument:

QGenericArgument args[] = {
            QGenericArgument(), ....... ,QGenericArgument(),};

for (int p = 0; p < parameterTypes.count(); ++p) {
    QVariant::Type type = QVariant::nameToType(parameterTypes.at(p));

    switch(type) {
    case QVariant::String:
        args[p] = Q_ARG(QString, obtainTheNextStringArgument());
        break;
    // the rest needed types here        
    }
}

mm.invoke(object, Qt::QueuedConnection, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8],args[9]);
0 голосов
/ 04 октября 2011

Вы можете либо:

  1. запишите сигнал с теми же параметрами по умолчанию, что и слот, который вы хотите вызвать, подключите его к слоту с помощью Qt::QueuedConnection и вызовите сигнал с помощью qt_metacall и вашего массива, или
  2. написать QObject производный класс, который:
    • принимает ваш массив параметров в качестве параметра для своего конструктора и сохраняет его внутри,
    • вызывает QMetaObject::invokeMethod в конструкторе с Qt::QueuedConnection, чтобы вызвать слот без параметра, который вызовет qt_metacall с массивом сохраненных параметров перед удалением QObject.

Внутренне Qt использует 2-й метод, но с внутренним классом: QMetaCallEvent corelib / kernel / qobject_p.h ) и postEvent вместо сигнала / слота подключение.

...