Seite 1 von 1

QThread und Widget

Verfasst: 10. September 2006 09:37
von DieterP
Hallo
Ich habe mit der KDevelop eine einfache Anwendung erstellt.
Und wenn ich auf einen Button klicke soll im MyThread eine etwas
längere Berechnung erfolgen.Das ergebnis möchte ich unter dem Button
im QLabel "zahl" darstellen,das Programm lässt sich übersetzen wenn ich
dies "zahl->setNum(total);" ausklammere.Hat jemand eine Idee wie ich
die QLabel "zahl" zugreifen kann.

Danke

[/code]

class MyThread : public QThread {
public:
MyThread( std::string a = "MyThread" );
virtual void run();
private:

std::string name;
};

MyThread::MyThread( std::string a ) : name(a)
{}

void MyThread::run()
{
int total=0;
//Hier ist eine längere Berechnung
//die ich rausgenommen habe

//dies funktioniert nicht
zahl->setNum(total);
}

//Button gedrückt
void NeuWidget::total_clicked()
{
MyThread total("total");
total.start();
}

Verfasst: 10. September 2006 11:22
von caligano
Hallo!

Ist total vom Typ int oder double ?

Code: Alles auswählen

void QLabel::setNum ( int num )  

Code: Alles auswählen

void QLabel::setNum ( double num ) 
Welche Signals und Slots hast du denn vergeben?

Verfasst: 10. September 2006 12:49
von DieterP
Hallo

total ist vom Type int.
Aber ich kann nicht auf "zahl->"(QLabel) zugreifen !

Slots nur für den Button.
Für zahl habe ich kein Signal und Slot.
Muss das?
Und wie mache ich das,im KDevelop kann ich für Sender "zahl" nichts
einsetzen.

Verfasst: 10. September 2006 13:34
von caligano
Hm ich kann das vielleicht grad nicht aus deinem Code erkennen, aber hast du in der Klassen Deklaration unter private einen Eintrag wie

Code: Alles auswählen

private:
   QLabel *zahl;
?

Außerdem fehlt (jedenfalls in diesem Code-Ausschnitt) etwas wie:

Code: Alles auswählen

zahl= new QLabel();
Du sagst, du kannst das Programm nicht kompilieren, wenn zahl->setNum(total) im Code steht, welche Fehler-Meldungen erhältst du?

Verfasst: 10. September 2006 14:28
von DieterP
Ich habe das mit dem KDevelop Designer gemacht.

Ich habe eben in der Klasse NeuWidget
"zahl->setNum(10);" eingetragen,und das geht.

Nur habe ich im QThread keinen zugriff auf "zahl"




[/code]
class NeuWidgetBase : public QWidget
{
Q_OBJECT

public:
NeuWidgetBase( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
~NeuWidgetBase();

QPushButton* Total;
QLabel* zahl;

public slots:
virtual void neuwidgetbase_destroyed(QObject*);
virtual void total_clicked();
protected:

protected slots:
virtual void languageChange();

};

NeuWidgetBase::NeuWidgetBase( QWidget* parent, const char* name, WFlags fl )
: QWidget( parent, name, fl )
{
zahl = new QLabel( this, "zahl" );
zahl->setGeometry( QRect( 270, 60, 120, 20 ) );

....

}

Verfasst: 10. September 2006 20:27
von DieterP
Hat keiner eine Idee was hier falsch ist.

Widget QLabel in QThread ansprechen ?

Verfasst: 12. September 2006 02:16
von heikob
Also mir erscheinen die Code-Schnipsel etwas merkwürdig, was auch an der Uhrzeit liegen kann.

Also in dem Fall, da du einen Thread mit der Berechnung vertraust, würde ich im Thread ein emit zahl(double ergebnis) aussenden, dass die Hauptapplikation empfängt und in einem entsprechenden Slot an eine Variable oder dem Label übergibt.

Da man ja nie weiss, wann der Thread mit der Berechnung fertig wird, ist das die sicherste Methode die ich kenne (Man möge mich da gerne korrigieren). Woher weisst du denn, wann du auf das Ergebnis zugreifen kannst? Also bisher hat bei mir die oben erwähnte Methode immer bestens funktioniert, aber ich lasse mich gerne eines besseren belehren.

Verfasst: 13. September 2006 10:35
von DieterP
@heikob
Mit denn Slots kenne ich mich nicht mit aus.(Muss ich mir noch mal genauer anschauen)
Merkwürdig ist für mich,das ich in einem neuen Thread,nicht auf die
Widgets in dem Mainthread zugreifen kann !