TreeView wird aus Klasse heraus nicht gefüllt

Alles rund um die Programmierung mit Qt
Antworten
Helgon
Beiträge: 9
Registriert: 5. Januar 2013 08:01

TreeView wird aus Klasse heraus nicht gefüllt

Beitrag von Helgon »

Hi,

ich hab folgendes Problem.

Ich habe ein QAbstractItemModell implementiert und das funktioniert auch - solang ich es in der "main" Methode aufrufe, also da wo der Qt Eintstiegspunkt ist und die QApplication initialisiert wird.

Also. Rufe ich den auskomentierten Code hier auf, erzeugt er mir ein TreeView und befüllt ihn richtig.

Code: Alles auswählen

int main(int argc, char *argv[])
{
	QResource::registerResource("Qt5Tutorial.rcc");

	QApplication app(argc, argv);
	app.setStyle("cleanlooks");

	Qt5Tutorial window;
	window.show();

	/*
	QTreeView *tree = new QTreeView();
	tree->show();
	LightNode rootNode("rootNode");
	CameraNode childNode0("childNode0", &rootNode);
	ObjectTreeModel model(&rootNode);
	tree->setModel(&model);*
	*/

	return app.exec();
}
Hier passiert jedoch nichts - Das UI wird zwar richtig angezeigt, aber es bleibt leer. Hat jemand eine Idee woran das liegt?

Code: Alles auswählen

Qt5Tutorial::Qt5Tutorial(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);

	LightNode rootNode("rootNode");
	CameraNode childNode0("childNode0", &rootNode);
	ObjectTreeModel model(&rootNode);
	ui.uiTree->setModel(&model);

}
Im Anhang seht ihr ein Screenshot damit das Problem ganz klar wird.

Hoffe das mir jemand weiterhelfen kann.

Grüße!
Dateianhänge
view.png
view.png (7.87 KiB) 5042 mal betrachtet
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Re: TreeView wird aus Klasse heraus nicht gefüllt

Beitrag von -=Freaky=- »

koennte es daran liegen, dass im konstruktor "rootNode", "childNode0" und "model" auf dem stack angelegt werden? also als "lokale variablen", und die werden beim austritt aus der funktion wieder geloescht. du koenntest probieren, sie auf dem heap anzulegen (also als pointer).
so z.b.

Code: Alles auswählen

LightNode *rootNode = new LightNode("rootNode");
CameraNode *childNode0 = new CameraNode("childNode0", rootNode);
ObjectTreeModel *model = new ObjectTreeModel(rootNode);
ui.uiTree->setModel(model);
Helgon
Beiträge: 9
Registriert: 5. Januar 2013 08:01

Re: TreeView wird aus Klasse heraus nicht gefüllt

Beitrag von Helgon »

Vielen, vielen Dank :)

Normalerweise hatte ich die immer auf dem Heap, aber irgendwann gings dann mal nicht, weil sie eben dort lagen und seit dem hab ich sie so initialisiert.. das hat mich schon so viele Stunden gekostet :wink:

Vielen Dank, jetzt läuft endlich alles, danke! :D

Grüße
Helgon
Beiträge: 9
Registriert: 5. Januar 2013 08:01

Re: TreeView wird aus Klasse heraus nicht gefüllt

Beitrag von Helgon »

Hi, ich missbrauch den Thread nochmal, weil es fast noch das gleiche ist. Bin bis heute leider nicht zu gekommen weiter zu machen und bin dann gleich auf ein weiteres Problem gestoßen. Bin grad nicht sicher ob ich total auf dem Schlauch stehe oder was da los ist (komm von Java :oops:)

Code: Alles auswählen

QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel();
	ObjectTreeModel *model = new ObjectTreeModel(rootNode);
	
	model->insertLights(0, 5);

	proxyModel->setSourceModel(model);
	ui.uiTree->setModel(proxyModel);

	QObject.connect(ui.uiFilter, SIGNAL("textChanged(QString)"), proxyModel->setFilterRegExp);
Wie man sieht, möchte ich den Wert des Textfeldes als RegExp benutzen und habe dazu eine Lösung in Python gefunden, die sich aber nicht grad 1:1 in C++ portieren lässt
Die Fehlermeldung die ich erhalte ist beim pointer to member operator proxyModel->setFilterRegExp mit der Fehlermeldung:

"Ein Zeiger auf eine gebundene Funktion darf nur zum Aufrufen der Funktion verwendet werden".

Leider war google nicht mal dabei hilfreich was eine "gebundene Funktion" sein soll. Jedoch macht der Rest für mich auch kein Sinn. Ich rufe die Funktion doch nur auf, also sollte doch alles passen, aber gerade das bemängelt die Fehlermeldung ja.

Ich hoffe, dass mir da nochmal jemand kurz unter die Arme greifen könnte.

Danke und Grüße!
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Re: TreeView wird aus Klasse heraus nicht gefüllt

Beitrag von -=Freaky=- »

den fehler bekommst du wohl, weil "peoxyModel->setFilterRegExp" kein sinnvoller ausdruck ist. du koenntest laut doku entweder einen functor uebergeben (z.b. eine globale funktion oder statische methode), oder einen pointer auf eine memberfunktion einer klasse, zumindest in Qt5. siehe http://qt-project.org/doc/qt-5.0/qtcore ... #connect-3.

vor Qt5 wuerde ich das normalerweise so machen:

Code: Alles auswählen

QObject::connect(ui.uiFilter, SIGNAL(textChanged(const QString&)), proxyModel, SLOT(setFilterRegExp(const QString&)));
in Qt5, wenn ich die doku richtig verstanden habe, so (nie probiert):

Code: Alles auswählen

QObject::connect(ui.uiFilter, &QLineEdit::textChanged, proxyModel, &QSortFilterProxyModel::setFilterRegExp);
(sofern ui.uiFilter ein QLineEdit ist)

oder wenn du es mit dem lambda-functor, wie in der doku, machen willst, was ich auch nie probiert habe, dann irgendwie so, c++11 vorausgesetzt:

Code: Alles auswählen

QObject::connect(ui.uiFilter, &QLineEdit::textChanged, [=](QString text){ proxyModel->setFilterRegExp(text); });
Helgon
Beiträge: 9
Registriert: 5. Januar 2013 08:01

Re: TreeView wird aus Klasse heraus nicht gefüllt

Beitrag von Helgon »

Hallo,

vielen, vielen Dank! So wie du es machen würdest - so geht es auch perfekt.

Habs mal wie in der Doku beschrieben versucht (kam aufs Gleiche was du geschrieben hast), aber dort sagt er mir immer nur das ich zu viele Argumente im Funktionsaufruf hätte, aber die Doku ist da ja eindeutig - komisch.

Auf jeden Fall wie gesagt vielen herzlichen Dank!

Grüße
Antworten