look997 Temat założony przez niniejszego użytkownika |
Dostęp do obiektu nadrzędniej klasy » 2013-06-20 22:09:12 Chcę przypisać wartości do standardowego w QT ui->lineEdit->setText('h'); Jak wiadomo, ui nie ma w tej przestrzeni nazw. Jak sprawić aby był, albo jak to zrobić inaczej? Najlepiej proszę poprawić ten fragment kodu(nie chodzi o gotowca, tylko przykład). class Producent : public QThread { public: Producent( int, int ); void run(); private: int n; int i; };
Producent::Producent( int n, int i ) { this->n = n; this->i = i; }
void Producent::run() { while( true ) { ui->lineEdit->setText( 'h' ); QNetworkAccessManager * manager = new QNetworkAccessManager( this ); connect( manager, SIGNAL( finished( QNetworkReply * ) ), this, SLOT( replyFinished( QNetworkReply * ) ) ); manager->get( QNetworkRequest( QUrl( "https://ad.resik/data.json" ) ) ); this->msleep( 50 ); } }
void OknaKlasa::replyFinished( QNetworkReply * reply ) { qDebug() << "DONE"; QJsonDocument document = QJsonDocument::fromJson( reply->readAll() ); QString string; ui->lineEdit->setText( string.setNum( document.object().value( "high" ).toDouble() ) ); }
OknaKlasa::OknaKlasa( QWidget * parent ) : QMainWindow( parent ) , ui( new Ui::OknaKlasa ) { ui->setupUi( this ); Producent producent1( 123, 1 ); producent1.start(); }
Chyba dziedziczenie tu nie pomoże(nie wiem czy to głupie pytanie)? |
|
Monika90 |
» 2013-06-21 07:29:47 Dodaj do klasy Producent składową typu referencja do typu ui, albo tylko referencja do typu ui->lineEdit, przekaż referencję do konstruktora klasy Producent, żeby mógł zainicjalizować tę składową.
Ale najpierw sprawdź w dokumentacji, czy wywoływanie ui->lineEdit->setText() jest w ogóle możliwe z więcej niż jednego wątku na raz. Innymi słowy, czy jest thread-safe. |
|
look997 Temat założony przez niniejszego użytkownika |
» 2013-06-21 23:06:48 Zrobiłem tak: class Producent : public QThread { public: Producent( int, int, Ui::OknaKlasa & ui ) { this->n = n; this->i = i; } void run(); Ui::OknaKlasa & ui; private: int n; int i; };
Producent producent1( 123, 1, ui ); Błędy: uninitialized reference member 'Producent::ui' [-fpermissive] no matching function for call to 'Producent::Producent(int, int, Ui::OknaKlasa*&)'
Czy coś robię źle? Może po prostu nie jest Thread-Safety. Jeśli nie jest Thread-Safety to jak to zrobić? |
|
Monika90 |
» 2013-06-22 06:28:15 Zwyczajnie nie znasz podstaw C++. Jak nie radzisz sobie z referencjami, to użyj wskaźnika, ui to wskaźnik do Ui::OknaKlasa.
Poza tym w funkcji run() masz pętlę nieskończoną i w każdym jej obiegu tworzysz nowy obiekt (20 razy na sekundę), to się źle skończy prędzej czy później...
Zresztą, jeśli masz zamiar ściągać coś z serwera 20 razy na sekundę, 24 godziny na dobę, to cię administrator tego serwera zbanuje. |
|
look997 Temat założony przez niniejszego użytkownika |
» 2013-06-22 12:25:58 No nie znam, jestem w trakcie uczenia właśnie teraz! To tylko do sprawdzenia, później nie będę ciągle nowych obiektów robił ani tak często się odwoływał do serwera. Patrzałem na to: http://edu.i-lo.tarnow.pl/inf/utils/002_roz/p005.php, zapomniałem ze ui to wskaźnik... Ze wskaźnikiem sobie poradziłem. |
|
look997 Temat założony przez niniejszego użytkownika |
» 2013-06-22 23:31:43 |
|
« 1 » |