Signal-Slot-Konzept funktioniert nur bedingt

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Irods
Beiträge: 53
Registriert: 24. Mai 2009 20:57
Kontaktdaten:

Signal-Slot-Konzept funktioniert nur bedingt

Beitrag von Irods »

Hi Leute.
Ich schreibe gerade ein kleines Podcast-Programm und ja, gleich beim Quellcode werden warscheinlich einige RSS-Feed-Kenner
die Kriese kriegen :D ... versucht es zu überleben :P.

Mein Problem liegt in der Klasse mit denen ich die Feed-Informationen lade (im mom nur Url und Name).
Wenn ich von dieser Klasse (FeedLoader) direkt in der Main-Funktion ein Objekt erstelle funktioniert alles super.

Also so:

Code: Alles auswählen

#include <QApplication>
#include "FeedLoader.h"

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	FeedLoader my("http://www.dradio.de/rss/podcast/sendungen/einewelt/?mode=text");
	return app.exec();
}
Wenn ich jedoch in einer anderen Klasse mit Qt-Vererbung ein Objekt von FeedLoader erzeuge (auf die gleiche Weise)
funktioniert in diesem Objekt das Signal-Slot-Konzept offenbar nicht (jedoch wird mit keine Fehlermeldung angezeigt).

Hier die Klasse:

Code: Alles auswählen

#ifndef FEEDLOADER_H
#define FEEDLOADER_H
#include <QWidget>
#include <QString>
#include <QNetworkAccessManager>
#include <QNetworkReply>

class FeedLoader : public QWidget
{
	Q_OBJECT
	public:
		FeedLoader(QString, QWidget *parent = 0);
	private:
		QUrl url;
		void loadPage();
		QString findElement(QString, QString);

	private slots:
		void requestFinished(QNetworkReply* reply);
		void parseSite(QString);

	signals:
		void connectionError();
		void received(QString);
		void feed(QString, QMap<QString, QString>);
};
#endif

Code: Alles auswählen

#include "FeedLoader.h"
#include <QDebug>

FeedLoader::FeedLoader(QString urltemp, QWidget *parent) : QWidget(parent)
{
	url = QUrl(urltemp);
	connect(this, SIGNAL(received(QString)), this, SLOT(parseSite(QString)));
	loadPage();
}

void FeedLoader::loadPage()
{
	QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
	connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(requestFinished(QNetworkReply*)));
	networkManager->get(QNetworkRequest(url));
	qDebug() << "FeedLoader:loadPage";
}

void FeedLoader::requestFinished(QNetworkReply* reply)
{
	qDebug() << "FeedLoader:requestFinished";
	if (reply->error() != QNetworkReply::NoError)
		emit connectionError();
	else
		emit received(QString::fromUtf8(reply->readAll()));
}

void FeedLoader::parseSite(QString content)
{
	qDebug() << "FeedLoader:parseSite";
	QStringList items = content.split("<item>");

	QMap<QString, QString> datas;

	QString title = findElement("title", items[0]);
//	qDebug() << "TITLE: " << title << endl << endl;

	for(int i=1; i<items.length(); i++)
	{
		QString temp = items[i].split("<enclosure url=\"")[1];
		QString tmpUrl;
		int j = 0;
		while(temp[j]!='"')
		{
			tmpUrl+=temp[j];
			j++;
		}

//		qDebug() << findElement("title", items[i]);
//		qDebug() << tmpUrl << endl;
		datas[findElement("title", items[i])] = tmpUrl;
	}

	emit feed(title, datas);
}

QString FeedLoader::findElement(QString name, QString text)
{
	if(!name.contains(name))
		return "error";

	return text.split("<"+name+">")[1].split("</"+name+">")[0];
}
Sprich mir wird zwar "FeedLoader:loadPage" angezeigt jedoch nicht "FeedLoader:requestFinished", was jedoch bei einem Element welches in der Main-Funktion erzeugt wurde reibungslos funktionierte.

Wenn jemand eine Idee hat oder sogar die Lösung ... schon mal danke.
Bye.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Signal-Slot-Konzept funktioniert nur bedingt

Beitrag von Christian81 »

Funktioniert prima - bei mir kommt er ohne Probleme in FeedLoader:requestFinished() an.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: Signal-Slot-Konzept funktioniert nur bedingt

Beitrag von solarix »

Wenn ich von dieser Klasse (FeedLoader) direkt in der Main-Funktion ein Objekt erstelle funktioniert alles super.

Code: Alles auswählen

int main(int argc, char *argv[])
{
  ..
   FeedLoader my("http://www.dradio.de/rss/podcast/sendungen/einewelt/?mode=text");
Bei mir auch. Jetzt können wir zu dritt bestätigen: dieses Beispiel funktioniert. Wie wäre es mit dem Code, wo es nicht funktioniert? Da könnte man viel besser das Problem suchen... :wink:

[EDIT]
Und wehe du schreibst jetzt:

Code: Alles auswählen

AndereKlasse::AndereKlasse(QWidget *parent) : QWidget(parent)
{
  FeedLoader my("http://www.dradio.de/rss/podcast/sendungen/einewelt/?mode=text"); // hier funktioniert es einfach nicht
}
:P
Irods
Beiträge: 53
Registriert: 24. Mai 2009 20:57
Kontaktdaten:

Re: Signal-Slot-Konzept funktioniert nur bedingt

Beitrag von Irods »

Hey ich hoffe das ist jetzt nich das was du mit "wehe" meinst :D

Code: Alles auswählen

#include <QApplication>
#include "PodcastLoader.h"

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	PodcastLoader my;
	my.show();
	return app.exec();
}

Code: Alles auswählen

#ifndef PODCASTLOADER_H
#define PODCASTLOADER_H
#include <QtGui>
#include <QDebug>
#include "FeedLoader.h"

class PodcastLoader : public QMainWindow
{
	Q_OBJECT
	public:
		PodcastLoader(QMainWindow *parent = 0);
	private:
		

	private slots:
		void FeedLoaded(QString,QMap<QString,QString>);
	signals:

};
#endif

Code: Alles auswählen

#include "PodcastLoader.h"

PodcastLoader::PodcastLoader(QMainWindow *parent) : QMainWindow(parent)
{
	FeedLoader test("http://www.dradio.de/rss/podcast/sendungen/einewelt/?mode=text");
	connect(&test, SIGNAL(feed(QString,QMap<QString,QString>)), this, SLOT(FeedLoaded(QString,QMap<QString,QString>)));
}

void PodcastLoader::FeedLoaded(QString title, QMap<QString, QString> datas )
{
	qDebug() << ">>>>>>>>" << title << "<<<<<<<<" << endl;

	QMapIterator<QString, QString> i(datas);
	while (i.hasNext())
	{
		i.next();
		qDebug() << i.key() << endl << i.value() << endl;
	}
}
Hier funktioniert es bei mir nicht.
Soll heisse er gibt zwar "FeedLoader:loadPage" aus aber nicht mehr "FeedLoader:requestFinished".
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Signal-Slot-Konzept funktioniert nur bedingt

Beitrag von Christian81 »

@Solarix: Doch... :cry:

@Irods: C++ Grundlagen ... wie lage lebt dein FeedLoader - Objekt?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: Signal-Slot-Konzept funktioniert nur bedingt

Beitrag von solarix »

:mrgreen:
Irods
Beiträge: 53
Registriert: 24. Mai 2009 20:57
Kontaktdaten:

Re: Signal-Slot-Konzept funktioniert nur bedingt

Beitrag von Irods »

ahhhh crap thx; tut ja richtig weh
Antworten