2013-06-25 21 views
5

Próbuję zaktualizować wartości w tabeli przy użyciu osobnego wątku roboczego, używając wątków POSIX.Ustawianie pozycji tabeli w wielu wątkach

Funkcja nitka pracownik wykonuje próbuje wykonać następujące czynności:

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

Jednak przy starcie pojawia się następujący błąd:

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

nie jestem pewien, w jaki sposób qRegisterMetaType działa. Zastanawiam się, czy ktoś ma jakiś pomysł, w jaki sposób mogę nadać wątkowi roboczemu bezpośredni dostęp do widgetów?

+0

Dyskusja na ten temat [tutaj] (http://stackoverflow.com/questions/7872578/how-to-properly-use-qregistermetatype-on-a-class-derived-from-qobject). Mówiąc prościej, pozwala to Qt "wiedzieć" o innych typach zdefiniowanych przez użytkownika lub jakieś zewnętrzne źródło. Zazwyczaj jest to wymagane w przypadku sygnałów i gniazd. – Huy

Odpowiedz

5

Uzyskiwanie dostępu do dowolnego widżetu z niczego poza głównym wątkiem nie jest dozwolone w Qt. Wszystkie operacje interfejsu użytkownika muszą być wykonywane z poziomu głównego wątku (z kilkoma wyjątkami, takimi jak malowanie na QImage).

W twoim przypadku wyślij sygnał w wątku roboczym, gdy chcesz dodać nowy element. W głównym wątku, masz szczelinę, która faktycznie tworzy element, tj. Wywołania ui->table->setItem(0,0,new QTableWidgetItem(tr("%1").arg(value)));. Następnie po prostu connect() sygnał i gniazdo razem. Qt zda sobie sprawę, że nadawca i odbiorca żyją w różnych wątkach i automatycznie używają QueuedConnection. Slot zostanie wywołany, gdy główny wątek Qt powróci do pętli zdarzeń.

Jeśli twój sygnał ma parametry, ich typ musi zostać zarejestrowany pod numerem qRegisterMetaType.

+0

Doceń pomoc. Po odrobinie googlowania zdałem sobie sprawę, że będę musiał usunąć wielowątkowość z widżetów. Czy można podać przykład użycia 'qRegisterMetaType' do zarejestrowania, powiedzmy, struktury? – sj755

+1

Rejestracja struktury jest łatwa, zobacz dokumentację qRegisterMetaType. Przykład: qRegisterMetaType ("MyStruct"); –

Powiązane problemy