Widget mit eigenem Slot



  • In deinem openneu.h musst du <thread.h> nicht <QThread.h> reinziehen.



  • bist du dir sicher ? weil in thread.h kommt doch eigentlich nur die Definition der Thread Klasse. Diese ist bei mir aber doch schon in openneu.h drin.



  • Ehm ich glaube hier liegt erneut ein Fehler vor...Hast du dir schonmal die Doku angesehen von QThread? Ableiten in eine Unterklasse ist schon richtig, aber du musst die virtuelle Funktion run() überschreiben und dann für das QThreadObjekt start() aufrufen. Holzeimer hat Quatsch erzählt!



  • 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....



  • BootLag-BootLag- 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 existierende openneuClass 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 in thread.h thread.cpp ausgelagert?

    thread.cpp ist Teil des Projekts, so dass der Compiler thread.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 Thread

    Ui::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.
    lg

    Edit: 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()
    

Anmelden zum Antworten