Ĺadny brzuch
Męczę się i męczę i googlam itd i nie mogę sobie poradzić z testową obsługą wątków w QT, a chodzi o to jak w metodzie run() wątku odwoływać się do komponentu textEdit znajdującego się na formularzu bez wywalenia wyjątku przy odwołaniu bezpośrednim. Wyczytałem, że można to zrobi na dwa sposoby:
Method 1 : emit a signal connected to QLabel::setText(). Like you said.
Method 2 : call QMetaObject::invokeMethod() from the secondary thread.
Wiec prubuję:
// w pliku nagłówkowym mainwindow.h dałem definicje klasy wątku class MyThread : public QThread { public: MyThread(); void run(); private: }; // w pliku implementacji mainwindow.cpp void MyThread::run() { for(int ii=0; ii < 10; ii++) { this->sleep(1); qDebug() << "watek "+ QString::number(ii); // jak wstawic dane np nr pęti ii do ui->textEdit bez wywołania wyjątku ???? } } // wywolanie w buttonie void MainWindow::on_pushButton_clicked() { ui->textEdit->append("Start wątku..."); MyThread *watek = new MyThread(); watek->start(); }
Program się kompiluje, ale po uruchomieniu wątki nic się nie pojawia w textEdit z metody run :(
Jak to zrobić prawidłowo najlepiej z podaniem metody (przykładowego kodu) dla invokeMethod oraz emit a signal :)
Pozdrawiam ALL
Użytkownik Darek_c++ edytował ten post 21 wrzesień 2009, 12:47
A musisz wstawiać tekst w oddzielnym wątku? jest to tak czasochłonna operacja? Ja w aplikacjach PyQt4 do klasy wątka bazującego na QThread przekazywałem obiekt aplikacji (głównego okna) jako self.parent i na nim operowałem z poziomu wątku (nie wszystkie operacje są dozwolone) wykonując metody na jakimś widgecie.
Najszybciej i najlepszą pomoc odnośnie Qt/C++ dostaniesz na http://www.qtcentre.org/forum/
W ostateczności http://qtforum.pl/ ;)
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Method 1 : emit a signal connected to QLabel::setText(). Like you said.
Method 2 : call QMetaObject::invokeMethod() from the secondary thread.
Wiec prubuję:
// w pliku nagłówkowym mainwindow.h dałem definicje klasy wątku class MyThread : public QThread { public: MyThread(); void run(); private: }; // w pliku implementacji mainwindow.cpp void MyThread::run() { for(int ii=0; ii < 10; ii++) { this->sleep(1); qDebug() << "watek "+ QString::number(ii); // jak wstawic dane np nr pęti ii do ui->textEdit bez wywołania wyjątku ???? } } // wywolanie w buttonie void MainWindow::on_pushButton_clicked() { ui->textEdit->append("Start wątku..."); MyThread *watek = new MyThread(); watek->start(); }
Program się kompiluje, ale po uruchomieniu wątki nic się nie pojawia w textEdit z metody run :(
Jak to zrobić prawidłowo najlepiej z podaniem metody (przykładowego kodu) dla invokeMethod oraz emit a signal :)
Pozdrawiam ALL
Użytkownik Darek_c++ edytował ten post 21 wrzesień 2009, 12:47
A musisz wstawiać tekst w oddzielnym wątku? jest to tak czasochłonna operacja? Ja w aplikacjach PyQt4 do klasy wątka bazującego na QThread przekazywałem obiekt aplikacji (głównego okna) jako self.parent i na nim operowałem z poziomu wątku (nie wszystkie operacje są dozwolone) wykonując metody na jakimś widgecie.
Najszybciej i najlepszą pomoc odnośnie Qt/C++ dostaniesz na http://www.qtcentre.org/forum/
W ostateczności http://qtforum.pl/ ;)