[solved] SLOTS anderer Klassen nutzen

Alles rund um die Programmierung mit Qt
daniel_23
Beiträge: 46
Registriert: 15. Mai 2006 18:53
Wohnort: Oldenburg
Kontaktdaten:

Beitrag von daniel_23 »

Eine letzte Frage bezueglich des Programms hab ich noch!
Es geht um das eigentliche Thema des Threads.
Das auslesen der Config friert die gui ein.
Deswegen hab ich ein Thread erstellt, hat auch ganz gut geklappt, der Thread wird ausgefuehrt, aber in der run Funktion brauch ich Zugriff auf Objekte der Main Klasse.
Also hab ich mir SIGNALE erstellt, die ich an den jeweiligen Stellen emitiere, und dann in der Main versuche zu connecten. Allerdings krieg ich das connecten nich hin, hier mal der code:

Hier ist die Thread Klasse:

Code: Alles auswählen

class logThread : public QThread
{
	Q_OBJECT

	public:
		void run();

	signals:
		QString getSettings(const char*);
		int logLinesValue();
		int maxLinesValue();
		const char* qtcharLog(QString xml);
		void paintLog(const char *t);
		void status(const char*, unsigned int);
};

#endif
Hier is der Thread Code:

Code: Alles auswählen

void logThread::run()
{
	QFile logFile(emit getSettings("logpath"));
	QFile logFile(Gui_Settings::self(this)->mergeConfig("logpath"));
	if (logFile.open(QIODevice::ReadOnly) == TRUE) {
		QTextStream openedLogFile( &logFile );
		QString wholeFile="a";

		int lines = (emit logLinesValue());
		int max =  (emit maxLinesValue());
//		int lines = Gui_Settings::self(this)->logLines->value();
//		int max = Gui_Settings::self(this)->maxLines->value();

		int hits=0;
		char logContent[lines*150];
		strcpy(logContent,"\0");

		TODO this function freezes the gui
		register int count=0;
		while(!wholeFile.isNull() && hits < lines && count < max) {
				wholeFile = openedLogFile.readLine(150);
//				if(!wholeFile.isNull() && wholeFile.contains(Gui_Settings::self(this)->mergeConfig("keyword"), Qt::CaseSensitive)) {
				if(!wholeFile.isNull() && wholeFile.contains(emit getSettings("keyword"), Qt::CaseSensitive)) {
//	strcat(logContent,Gui_Settings::self(this)->qtcharO(wholeFile));
					strcat(logContent,(emit qtcharLog(wholeFile)));
					strcat(logContent,"\n");
					hits++;
				}
			count++;
		}

		if(strlen(logContent) != 0) {
			emit paintLog(logContent);
			emit status("LogFile succesfully scanned",40000);
//			PaintArea(logContent);
//			statusBar()->showMessage ("LogFile succesfully scanned",40000);
		}
		else {
			emit paintLog("No entries in LogFile");
			emit status("No entries in LogFile",40000);
//			PaintArea("No entries in LogFile");
//			statusBar()->showMessage ("No entries in LogFile",40000);
		}
		logFile.close();
	}
	else {
		emit paintLog("Cant open LogFile");
		emit status("No LogFile found",40000);
//		PaintArea("Cant open LogFile");
//		statusBar()->showMessage ("No LogFile found",40000);
	}
}
Dashier ist ein SLOT der Main Klasse der beim Button click ausgeloest wird:

Code: Alles auswählen

//TODO read File reverse
void QscannerMain::checkLog()
{
	statusBar()->showMessage ("Start searching the Log...",40000);
	logThread thread;
	thread.start(QThread::NormalPriority); 
	sleep(2);
}
Und hier der connect Versuch aus der qscannermain.cpp datei:

Code: Alles auswählen

	connect(logThread::thread, SIGNAL(getSettings(const char*)), this, SLOT(mergeConfig(const char*)));
	connect(logThread::thread, SIGNAL(logLinesValue()), this->logLines , SLOT(value()));
	connect(logThread::thread, SIGNAL(maxLinesValue()), this->maxLines , SLOT(value()));
	connect(logThread::thread, SIGNAL(qtcharLog(QString xml)), Gui_Settings::self(this), SLOT(qtcharO(QString xml)));
	connect(logThread::thread, SIGNAL(paintLog(const char *t)), this, SLOT(PaintArea(const char *t)));
	connect(logThread::thread, SIGNAL(status(const char*, unsigned int)), statusbar, SLOT(showMessage(const char*, unsigned int)));
Der Compiler Error lautet wie folgt:

Code: Alles auswählen

scannermain.cpp:131: error: no matching function for call to `QscannerMain::
    connect(<unknown type>, const char[26], QscannerMain* const, const char[26])
Ich hab den Header mit der Thread Klasse am Anfang der Qscannermain.cpp includiert, von daher sollte die bekannt sein, es wird wohl an dem Objekt liegn, aber click hats bei mir noch nich gemacht...

EDIT: Naja das wars wohl nich selbst wenn ich "logThread thread;" direkt vor den connects defeniere klappts nich

Waere echt nett wenn mich jemand aufklaeren koennte was da falsch laeuft! Dann pack ich auch ein solved beim titel rein :-)
daniel_23
Beiträge: 46
Registriert: 15. Mai 2006 18:53
Wohnort: Oldenburg
Kontaktdaten:

Beitrag von daniel_23 »

Habs, es muss &thread sein beim connecten, hab jetz zwar nen haufen andere Errors, aber mal sehn ob ich die noch wegkriege..

Das einzige Problem was ich jetz noch hab, ist Objekte der ui Datei anzusprechen beim connecten.

Code: Alles auswählen

connect(&thread, SIGNAL(logLinesValue()), Gui_Settings::self(this)->logLines , SLOT(value()));

Code: Alles auswählen

Object::connect: No such slot QSpinBox::value()
Object::connect:  (receiver name: 'logLines')
Naja die connects wo keine Errors kommen funzen irgendwie auch nicht!
Need help!

EDIT:
Die Statusbar konnte ich jetzt connecten, die value() slots der QSpinBox noch nicht, wenn ich aber das erstellte status Signal emitiere verabschiedet sich das Programm:
Das is der connect

Code: Alles auswählen

	connect(&thread, SIGNAL(status(const QString, int)), statusbar, SLOT(showMessage(const QString, int)));

Code: Alles auswählen

	emit status("LogFile succesfully scanned",40000);
Mir is echt nich klar woran das liegt! Hier ein weiteres beispiel:
Der connectversuch, zwischen einem aus dem Thread emitierten SIGNAL und einem SLOT aus der MainClass:

Code: Alles auswählen

	connect(&thread, SIGNAL(paintLog(const char*)), this, SLOT(testSlot(const char*)));
Hier is der SLOT

Code: Alles auswählen

void QscannerMain::testSlot(const char *bla)
{
       printf("blaaa\n");
}
Und hier der Error wenn das SIGNAL emitiert wird:

Code: Alles auswählen

qscanner: pthread_mutex_lock.c:108: __pthread_mutex_lock: Zusicherung »mutex->__data.__owner == 0« nicht erfüllt.
daniel_23
Beiträge: 46
Registriert: 15. Mai 2006 18:53
Wohnort: Oldenburg
Kontaktdaten:

Beitrag von daniel_23 »

up

Ein andres merkwuerdiges Problem ist, die destruction des Threads.
Ich starte den Thread in am ende eines main SLOTS mit

Code: Alles auswählen

thread.start(QThread::NormalPriority);
nach dieser Zeile endet der SLOT aber es wird auch sofort der destruktor des Threads aufgerufen, also wenn ich da nich noch ne zeile sleep(2); hinter mache dann schmiert das Programm sofort ab.
Mt dem sleep(2); wird der run() SLOT weiter abgearbeitet, bis sich das Programm wegn den connections verabschiedet
daniel_23
Beiträge: 46
Registriert: 15. Mai 2006 18:53
Wohnort: Oldenburg
Kontaktdaten:

Beitrag von daniel_23 »

Ich hab die Loesung inzwischen, is auch eigentlich ne ganz logische Sache.
Die definitionen verlieren nach der Funktion ihre Gueltigkeit, das loest fast alle meiner Probleme
Antworten