Seite 1 von 1

Klassenübergreifend Slots aufrufen

Verfasst: 23. November 2008 10:30
von Mefisto
Hallo!

Wahrscheinlich geht das zwar eh aus dem folgendem Problem hervor, aber ich dachte mir, dass ich es trotzdem nochmal erwähnen sollte: Ich bin absoluter Anfänger ;)... Mir macht QT richtig Spaß und die Programmierung damit, weil doch eigentlich alles relativ intuitiv ist... Aber ab und zu bleib ich dann doch noch hängen, so wie jetzt:

connect(button_minaddfinal,SIGNAL(clicked()),this,SLOT(mainwindow::setaddmin(input_vorname->text(), input_nachname->text(), 5, 5)));

Der Button "button_minaddfinal" der Klasse "dialogminadd::dialogminadd" sollte eigentlich den Slot "setaddmin()" der Klasse mainwindow::mainwindow aufrufen. Tut er aber nicht, ich habe bisher schon überprüft, dass die besagte Funktion gar nicht erst ausgeführt wird, also liegt es nicht am Inhalt der Funktion sondern am oben gepostetem Connect. Ich denke mal, dass es recht einfach ist, was ich vor habe, aber hier konnte ich mir nichtmehr selber helfen...

Ich wäre übrigens sehr dankbar wenn jetzt nicht irgendwelche Antworten kommen wie C++ Handbuch kaufen oder sowas ;) Das ist immer ziemlich unhilfreich ;)

Danke schonmal im Voraus :)
Jonathan

Verfasst: 23. November 2008 11:11
von -=Freaky=-

Code: Alles auswählen

connect( button_minaddfinal, SIGNAL( clicked() ), mainwindow, SLOT( setaddmin() ) )
vorausgesetzt, mainwindow ist ein zeiger auf ein entspr. objekt.

signal und slot muessen dieselben parameter haben, ansonsten musst du entweder QSignalMapper probieren oder einen slot zwischenschalten:
button_minaddfinal loest bspw. mit dem clicked()-signal den slot callSetAdmin() von mainwindow auf, und in diesem slot wird dann ausgefuehrt, was eigentlich ausgefuehrt werden sollt, etwa

Code: Alles auswählen

mainwindow->setaddmin(input_vorname->text(), input_nachname->text(), 5, 5)
mfg,
julian

Verfasst: 23. November 2008 12:36
von Mefisto
Hm, das ist aber auch wieder ein Problem... Weil wenn ich die aufzurufende Funktion als pucblic Slot von mainwindow mache, bekomme ich sie nicht mit dem connect-dingens aufgerufen (auch wenn ich da den zeiger der klasseninstanz anstelle von this schreibe)...

Wenn ich die Funktion als public slot von dem dialog mache, also einfach, dass beim klicken auf den button, eine function von der selben klasse aufgerufen wird, dann bekomme ich innerhalb der Funktion nicht die Funktion der anderen Klasse aufgerufen, weil eine FUnktion nicht ohne die Instanz ihrer Elternklasse existieren kann...

Was mache ich falsch?

Die main.cpp:

Code: Alles auswählen

#include <QApplication>
#include "mainwindow.h"
#include "dialog_minadd.h"

using namespace std;
 
int main(int argc, char *argv[]) {
	QApplication app(argc, argv);
	mainwindow *window = new mainwindow;
	window->show();
	return app.exec();
}
Die mainwindow.cpp, die Hauptdatei:

Code: Alles auswählen

#include <QtGui> 
#include <QDialog>
#include <QDir>

#include "mainwindow.h"
#include "dialog_minadd.h"

mainwindow::mainwindow() {
	setupUi(this);
	connect(button_minhinzu,SIGNAL(clicked()),this,SLOT(launchminadd()));
	table_min->setRowCount(0);
}

dialogminadd::dialogminadd() {
	setupUi(this);
	connect(button_minaddabort,SIGNAL(clicked()),this,SLOT(close()));
	connect(button_minaddfinal,SIGNAL(clicked()),mainwindow,SLOT(launchsetaddmin()));
	connect(button_minaddfinal,SIGNAL(clicked()),this,SLOT(close()));
}

void mainwindow::launchminadd() {
	dialogminadd *minadd_show = new dialogminadd;
	minadd_show->show();
}

void mainwindow::launchsetaddmin() {
	QString vornameinput = "Test";
	QString nachnameinput = "Text";
	setaddmin(vornameinput, nachnameinput, 5, 5);
}

void mainwindow::setaddmin(QString vorname, QString nachname, int alter, int gruppe) {
	label->setText("Test Generator");
	table_min->setRowCount(0);
	QTableWidgetItem *vornameitem = new QTableWidgetItem(vorname);
	QTableWidgetItem *nachnameitem = new QTableWidgetItem(nachname);
	QTableWidgetItem *alteritem = new QTableWidgetItem(alter);
	QTableWidgetItem *gruppeitem = new QTableWidgetItem(gruppe);
	int row = table_min->rowCount();
	table_min->insertRow(row);
	table_min->setItem(row, 0, vornameitem);
	table_min->setItem(row, 1, nachnameitem);
	table_min->setItem(row, 2, alteritem);
	table_min->setItem(row, 3, gruppeitem);
}

Verfasst: 23. November 2008 18:17
von -=Freaky=-
achso, ich dachte, mainwindow sei der bezeichner eines objekts deiner klasse und nicht der klassenname ...
so wie ist jetzt ist, ersetze mal in der connect-zeile mainwindow durch this.
wenn ich nicht zu ungenau gelesen hab sollte das funktionieren denk ich.
du kannst btw. keine klassenbezeichner, sondern nur existierende objekte (instanzen) connecten.

mfg,
julian

Verfasst: 25. November 2008 11:39
von Mefisto
Hm, nein, das funktioniert so leider dann immer noch nicht... Kanns sein, dass mein ganzer Aufbau des Codes Müll ist? Wie erstellt man denn am besten einen Dialog, dessen Inhalte dann hinterher in der Klasse, aus der er aufgerufen wurde, wiederverwendet werden können? Ich hätte das ganze ja vielleicht anders gemacht, wenn ich nicht noch meine .ui-Dateien einbinden müsste... :/

Verfasst: 25. November 2008 12:35
von pfid
Mefisto hat geschrieben:Hm, nein, das funktioniert so leider dann immer noch nicht... Kanns sein, dass mein ganzer Aufbau des Codes Müll ist? Wie erstellt man denn am besten einen Dialog, dessen Inhalte dann hinterher in der Klasse, aus der er aufgerufen wurde, wiederverwendet werden können? Ich hätte das ganze ja vielleicht anders gemacht, wenn ich nicht noch meine .ui-Dateien einbinden müsste... :/
Konstruktor:

foo = new MyDialog(parent);

Funktion1:

foo.exec();

Funktion2:

QString string = foo.getString();


Oder versteh ich dich falsch?
Btw hat das einen besonderen Grund, warum du knallhart deinen kompletten Quellcode klein schreibst?