QThread und Widget

Alles rund um die Programmierung mit Qt
Antworten
DieterP
Beiträge: 5
Registriert: 10. September 2006 09:21

QThread und Widget

Beitrag 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();
}
caligano
Beiträge: 126
Registriert: 19. August 2006 15:33

Beitrag 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?
DieterP
Beiträge: 5
Registriert: 10. September 2006 09:21

Beitrag 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.
caligano
Beiträge: 126
Registriert: 19. August 2006 15:33

Beitrag 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?
DieterP
Beiträge: 5
Registriert: 10. September 2006 09:21

Beitrag 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 ) );

....

}
DieterP
Beiträge: 5
Registriert: 10. September 2006 09:21

Beitrag von DieterP »

Hat keiner eine Idee was hier falsch ist.

Widget QLabel in QThread ansprechen ?
heikob
Beiträge: 81
Registriert: 23. März 2005 23:20

Beitrag 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.
DieterP
Beiträge: 5
Registriert: 10. September 2006 09:21

Beitrag 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 !
Antworten