Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dostęp do obiektu nadrzędniej klasy

Ostatnio zmodyfikowano 2013-06-22 23:31
Autor Wiadomość
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).

C/C++
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' ); // tutaj
       
        // ale też to:
        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() ) ); // przypisanie najwyższej("high") w tym dniu
}

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)?
P-85881
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.
P-85897
look997
Temat założony przez niniejszego użytkownika
» 2013-06-21 23:06:48
Zrobiłem tak:
C/C++
class Producent
    : public QThread
{
public:
    Producent( int, int, Ui::OknaKlasa & ui ) {
        this->n = n;
        this->i = i;
    }
    void run();
    Ui::OknaKlasa & ui;
    //Ui::OknaKlasa & ref_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ć?
P-85927
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.
P-85929
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.
P-85948
look997
Temat założony przez niniejszego użytkownika
» 2013-06-22 23:31:43
P-85973
« 1 »
  Strona 1 z 1