2012-02-18 94 views
2

我正在做一個Qt項目,其中invoke方法在單獨的線程上運行並從主線程調用。 如果我傳遞一個QByteArray作爲常量,它會生成並運行。 但是,如果我刪除了它建立的const,但在我嘗試運行它時終止, 並拋出一個斷言Q_ASSERT(b)QMetaObject :: invokeMethod不採用非const參數

爲什麼它終止?

我必須在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 
+0

'calculateSpectrum'的簽名是什麼?你是否期待在調用者中修改'buffer'? – Mat 2012-02-18 07:48:15

+0

是的,我希望更改緩衝區和簽名是spectrumanalyser(qbytearray緩衝區,int頻率,int字節,qint64數據長度) – ken 2012-02-18 07:58:30

+0

請編輯正確的方法的簽名到您的問題(使用標籤下的「編輯」鏈接)。 – Mat 2012-02-18 08:15:30

回答

4

基本上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參數時,條件變成false,它將在運行時拋出一個斷言。

相關問題