Widget mit eigenem Slot
-
Und um mich nochmal zu wiederholen, die Erzeugung zweier unabhängig voneinander existierender GUI-Objekte in zwei verschiedenen Klassen ist gewollt?!
btw du hast due run()-Funktion bereits da, nur auskomentiert....
-
schrieb:
Holzeimer hat Quatsch erzählt!
Ich bin davon ausgegangen das die Thread-Klasse in einem eigenen Headerfile thread.h ist. Willst du das in einem File musst du die Klasse Thread vor der Klasse openneu deklarieren.
-
habe es versucht umzusetzen. Leider stecke ich wieder fest.
error C2065: 'thread1': nichtdeklarierter Bezeichner
error C2228: Links von ".isRunning" muss sich eine Klasse/Struktur/Union
error C2228: Links von ".start" muss sich eine Klasse/Struktur/Union befinden.habe ich vergessen etwas einzubinden ? lg
thread.cpp
#include <QtGui> #include "thread.h" Thread::Thread() { Thread thread1; } void Thread::run() { //Hier findet die eigentliche Arbeit statt ui.label->setText("Thread wurde gestartet"); }
thread.h
//thread.h #ifndef THREAD_H #define THREAD_H #include <QThread> class Thread : public QThread { Q_OBJECT public: Thread(); protected: void run(); }; #endif
openneu.h
#ifndef OPENNEU_H #define OPENNEU_H #include <QtGui/QMainWindow> #include <QDialog> #include <QTextEdit> #include "thread.h" #include "ui_openneu.h" class openneu : public QMainWindow { Q_OBJECT public: openneu(QWidget *parent = 0, Qt::WFlags flags = 0); ~openneu(); private: Ui::openneuClass ui; Thread thread1; private slots: void threadlauft(); void threadReady(); void startThread1(); void eigenfunktion() { ui.label->setText("test"); } }; #endif // OPENNEU_H
openneu.cpp
#include "openneu.h" openneu::openneu(QWidget *parent, Qt::WFlags flags) : QMainWindow(parent, flags) { ui.setupUi(this); connect( ui.pushButton, SIGNAL( clicked() ),this , SLOT( eigenfunktion() ) ); connect( ui.pushButton_2, SIGNAL( clicked() ),this , SLOT( startThread1() ) ); } openneu::~openneu() { } void openneu::threadlauft() { ui.label->setText("Thread läuft schon"); } void openneu::threadReady() { ui.label->setText("Thread ist fertig"); } /* void openneu::startThread1() { if(thread1.isRunning()) { threadlauft(); connect(&thread1, SIGNAL(finished()), this, SLOT( threadReady())); } else { thread1.start(); } } */
main.cpp
#include "openneu.h" #include <QtGui/QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); openneu w; w.show(); return a.exec(); }
-
bin schon seit zwei Tagen dran. Ich packe es einfach nicht das openneu das Objekt von Thread sieht.
-
Grundlegend falsch ist
Thread::Thread() { Thread thread1; }
Dabei erzeugt eine Thread-Instanz in ihrem Konstruktor wiederum eine Thread-Instanz. Und das endlos !!
class Thread: public QThread { ... Ui::openneuClass ui; ... }
Damit wird eine 2. Instanz der Ui::openneuClass erzeugt. Das macht keinen Sinn.
Willst du im Thread auf die existierendeopenneuClass
Instanz zugreifen, kannst du das in folgender Art verwenden. Ist zwar nicht schön, sollte aber gehen.class Thread: public QThread { ... Ui::openneuClass* ui; Thread(openneuClass* _ui, QObject * parent = 0 ) : QThread(parent) { ui = _ui; } ... }
Mir scheint, du hast das grundlegende C++ Klassenkonzept nicht ganz verstanden
. Nicht aufgeben, aller Anfang ist schwer. Es lohnt sich auf jeden Fall dran zu bleigen
-
@holzeimer
ups ich habe leider openneu.cpp als openneu.h gepostet. Ist jetzt korrigiert.
Meiner Meinung nach mü´te ich Thread thread1 in der openneu Klasse deklarieren.Aber leider kommt dann der Fehler:
error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Thread::Thread(void)" (??0Thread@@QAE@XZ)" in Funktion ""public: __thiscall openneu::openneu(class QWidget *,class QFlags<enum Qt::WindowType>)" (??0openneu@@QAE@PAVQWidget@@V?$QFlags@W4WindowType@Qt@@@@@Z)".
fatal error LNK1120: 1 nicht aufgelöste externe Verweise.deswegen habe ich versucht es in den Konstruktor einzubauen. lg
-
Du hast
class Thread
inthread.h thread.cpp
ausgelagert?thread.cpp
ist Teil des Projekts, so dass der Compilerthread.cpp
übersetzt und anschließend beim Linken dazuhängt?Die Fehlermeldung deutet darauf hin, dass dies nicht so ist.
-
jap habe die Klasse Thread aufgeteilt. Denke es liegt an den include files.
lg
-
Ha, es lebt. Ich musste nur die include Ordner im Visual Studio adden.
Nun gut,ich kann es endlich starten.
Lieder passiert aber für mich etwas sehr eigenartiges.Thread::run()
erkennt
ui.label->setText()
nicht an.
Darauf habe ich ( glaube auch nicht das es ganz richtig ist)
In der Klasse ThreadUi::openneuClass ui
eingefügt.
Klicke ich nun auf den Button kommt der Fehler:Unbehandelte Ausnahme bei 0x6706c99c (QtCored4.dll) in openneu.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x8b01e88b.
Und springt in die Zeile:
inline int size() const { return d->size; } aus der qstring.h Datei.
Mit der Aufrufliste
QtCored4.dll!QString::size() Zeile 104 + 0xc Bytes C++Bin wieder ratlos und für jede Hilfe oder Tipp dankbar.
lgEdit: Wenn ich system("cmd") in run() einbaue läuft alles wie es soll. ( sehr geil). Was mache ich also mit dem label falsch. hmmmmmm
-
Problem ist
openneu.h
class openneu : public QMainWindow { ... private: <------- Ui::openneuClass ui;
Somit ist ui von außen nicht zugänglich.
Ich würde es so machen.
class openneu : public QMainWindow { ... private: Ui::openneuClass ui; public: void setLabel(const QString& label); void openneu::setLabel(const QString& label) { ui->label->setText(label); }
#include "openneu.h" class Thread: public QThread { openneu* ui; Thread(openneu* _ui, QObject * parent = 0 ) : QThread(parent) { ui = _ui; } } ... ui->setLabel()