2013-06-25 11 views
5

Sto tentando di aggiornare i valori in una tabella utilizzando un thread di lavoro separato, utilizzando i thread POSIX.Impostazione degli elementi della tabella su più thread

La funzione il thread di lavoro è in esecuzione sta cercando di effettuare le seguenti operazioni:

ui->table->setItem(0,0,new QTableWidgetItem(tr("%1").arg(value))); 

Tuttavia, in fase di esecuzione ottengo il seguente errore:

QObject::connect: Cannot queue arguments of type 'QVector<int>' 
(Make sure 'QVector<int>' is registered using qRegisterMetaType().) 

io non sono del tutto sicuro di come che qRegisterMetaType funziona. Mi chiedo se qualcuno ha qualche idea su come concedere al thread di lavoro l'accesso diretto ai widget?

+0

C'è stata qualche discussione su questo [qui] (http://stackoverflow.com/questions/7872578/how-to-properly-use-qregistermetatype-on-a-class-derived-from-qobject). In termini semplici, è usato per far "sapere" a Qt su altri tipi definiti dall'utente o da una fonte esterna. In genere è richiesto per segnali e slot. – Huy

risposta

5

L'accesso a qualsiasi widget da qualsiasi argomento tranne il thread principale non è consentito in Qt. Tutte le operazioni dell'interfaccia utente devono essere eseguite all'interno del thread principale (con alcune eccezioni, come la verniciatura su un QImage).

Nel tuo caso, emettere un segnale nel thread di lavoro quando si desidera aggiungere un nuovo elemento. Nel thread principale, disporre di uno slot che crea effettivamente l'elemento, ovvero chiamate ui->table->setItem(0,0,new QTableWidgetItem(tr("%1").arg(value)));. Quindi semplicemente connect() il segnale e lo slot insieme. Qt realizzerà che mittente e ricevente vivono in thread diversi e usano automaticamente uno QueuedConnection. Lo slot verrà chiamato ogni volta che il thread principale di Qt ritorna al ciclo degli eventi.

Se il segnale ha parametri, il loro tipo deve essere registrato con qRegisterMetaType.

+0

Apprezzo l'aiuto. Dopo un po 'di googling mi sono reso conto che dovrò rimuovere il multithreading dai widget. Potrebbe fornire un esempio di come 'qRegisterMetaType' viene usato per registrare, diciamo, una struttura? – sj755

+1

La registrazione di una struttura è semplice, consultare la documentazione di qRegisterMetaType. Esempio: qRegisterMetaType ("MyStruct"); –

Problemi correlati