QMetaObject :: invokeMethod не принимает неконстантный аргумент - PullRequest
2 голосов
/ 18 февраля 2012

Я делаю проект с Qt, где метод invoke запускается в отдельном потоке и вызывается из основного потока. Если я передаю QByteArray как const, он собирается и запускается. Однако, если я удаляю const, который он создает, но завершает работу, когда я пытаюсь его запустить, и выбрасывает утверждение Q_ASSERT(b).

Почему это прекращается?

Я должен добавить некоторые данные в QByteArray.

const bool b = QMetaObject::invokeMethod(m_thread, "calculateSpectrum",
                              Qt::AutoConnection,
                              Q_ARG(QByteArray, buffer),
                              Q_ARG(int, format.frequency()),
                              Q_ARG(int, bytesPerSample),
                              Q_ARG(qint64, dataLength));
    Q_ASSERT(b);
    Q_UNUSED(b) // suppress warnings in release builds

1 Ответ

4 голосов
/ 28 февраля 2012

в основном сигнатура QMetaobject :: invokemethod: ...

bool    invokeMethod ( QObject * obj, const char * member, Qt::ConnectionType type, QGenericReturnArgument ret, QGenericArgument val0 = QGenericArgument( 0 ), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument() );

Теперь в этом мы используем макрос Q_ARG с синтаксисом ..

QGenericArgument    Q_ARG ( Type, const Type & value )

, который требуетПараметр const.

Теперь, когда вы удаляете этот параметр const, условие становится ложным, и оно генерирует утверждение во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...