Seite 1 von 1

Klassenobjekt für connect() führt zu Fehler

Verfasst: 28. August 2009 12:23
von Gorion
Hi Folks,

sitz hier grad und weiss nimmer weiter....
Ich bekomme folgenden Fehler, wenn ich mein Projekt übersetze:

Code: Alles auswählen

 error: no matching function for call to ¤˜KlingelFeldThread::KlingelFeldThread()'
Mein Ziel ist es einen über einen Socket empfangenen String via Signal/Slot an den Gui Thread zu schicken um ihn da in einem Label anzuzeigen. Ich habe mich dazu der Beispiele Threaded Fortune Server und Blocking Fortune Client bedient und 3 Klassen wie beim Server Example erstellt. Ich setz hier mal den Code der Gui-Klasse und meiner Thread-Klasse rein, die Network-Klasse tut das was sie tun soll :)

Gui-Klassendefinition:

Code: Alles auswählen

#ifndef KLINGELFELD_H
#define KLINGELFELD_H
#include <QString>
#include <QObject>
#include <QTcpServer>
#include "ui_KlingelFeld.h"
#include "KlingelFeldNetworking.h"
#include "klingelfeldthread.h"

class KlingelFeld : public QMainWindow, public Ui::KlingelFeld
{
    Q_OBJECT

public:
    KlingelFeld(QMainWindow *parent = 0);
    ~KlingelFeld();

public slots:
    void newText(const QString &labText);

private:
    Ui::KlingelFeld ui;
    KlingelFeldNetworking Server;
    QString address;
    quint16 port;
    KlingelFeldThread Thread; [color=red]<-- um das gehts[/color]
};

#endif
Gui-Quelldatei:

Code: Alles auswählen

#include <QtGui>
#include <QObject>
#include <QtNetwork>
#include <iostream>
#include <stdlib.h>
#include <QHostAddress>
#include "KlingelFeld.h"
#include "KlingelFeldNetworking.h"
#include "klingelfeldthread.h"
using namespace std;

KlingelFeld::KlingelFeld(QMainWindow *parent)
     : QMainWindow(parent)
{
    setupUi(this);
......

    cout<<"Socket Init"<<endl;
    address = QString::QString("127.0.0.1");
    port = 59001;

    if (!Server.listen(QHostAddress::QHostAddress(address), port)) {
    QMessageBox::critical(this, tr("KlingelFeld Server"),
                                tr("Unable to start the server: %1.")
                                .arg(Server.errorString()));
        close();
        return;
    }
    cout<<"Socket Init Ende, SignalSlot Connects"<<endl;
    connect(&Thread,SIGNAL(getText(QString)),this,SLOT(newText(QString)));[color=red]<--- dieser connect[/color]
    cout<<"Ende Konstruktor Klingelfeld"<<endl;


}

KlingelFeld::~KlingelFeld(){
}

void KlingelFeld::newText(const QString &labText){
    QMessageBox::information(this, tr("KlingelFeld"),
                                 labText);
}
ThreadKlasse - Klassendefinition:

Code: Alles auswählen

#ifndef KLINGELFELDTHREAD_H
#define KLINGELFELDTHREAD_H
//#include "KlingelFeld.h"
#include <QObject>
#include <QThread>
#include <QTcpSocket>
#include <QMutex>
#include <QWaitCondition>

class KlingelFeldThread : public QThread
{
    Q_OBJECT

public:
    KlingelFeldThread(int socketDescriptor, QObject *parent);
    //KlingelFeldThread(QObject *parent);
    ~KlingelFeldThread();
    void run();

signals:
    void error(QTcpSocket::SocketError socketError);
    void getText(const QString &text);[color=red]<--- dieses Signal[/color]

private:
    //KlingelFeld feld;
    int socketDescriptor;
    QMutex mutex;
    QWaitCondition cond;
    bool quit;

};

#endif // KLINGELFELDTHREAD_H
Kann mir hier vielleicht jmnd helfen, ich weiss nicht mehr weiter....

Grüsse Michael

Verfasst: 28. August 2009 12:59
von Christian81
Du erzeugst eine Instanz von KlingelFeldThread in deiner KlingelFeld Klasse aber übergibst nicht die nötigen Parameter socketDescriptor, und parent.

Code: Alles auswählen

KlingelFeldThread(int socketDescriptor, QObject *parent); 
Also entweder keine Instanz als Member sondern einen Pointer oder im ctor von KlingelFeld den member korrekt initialisieren -> c++ basics.

Verfasst: 28. August 2009 14:35
von Gorion
Bin jetzt hingegangen und hab einen Standardkonstruktor in der Klasse KlingelFeldThread hinzugefügt. Hat funktioniert!

Code: Alles auswählen

header:
KlingelFeldThread();

cpp:
KlingelFeldThread::KlingelFeldThread(){}
Mfg Michael
Danke :)

Verfasst: 28. August 2009 14:52
von Christian81
Und wie setzt Du dann den socketDescriptor - member?

Verfasst: 28. August 2009 15:12
von Gorion
den alten Konstruktor habe ich drin gelassen....

Fehler?

Ansonsten geh ich hin und initialisiere das Objekt mit new Operator

Grüssle Michael

Verfasst: 28. August 2009 15:23
von Christian81
Das musst du wissen für was socketDescriptor nötig ist...

Verfasst: 31. August 2009 09:02
von Gorion
socketDeskriptor brauche ich, wenn ich den thread starte :)