-
08. 02. 2013, 11:20 #1Mitglied
- Registriert seit
- Dec 2011
- Beiträge
- 16
[C++ / Qt] QtCreator Designer: QColumnView hat keinen Inhalt
Hallo Leute,
ich habe ein merkwürdiges Problem. Ich verwende den QtCreator, habe mir also mit dem Designer ein kleines Fenster gemacht, in dem eine QColumnView liegt.
In meiner Fensterklasse habe ich dann Testweise versucht, darauf zuzugreifen.
Wenn ich den Zugriff über ein QStringListModel mache (im Konstruktor der Klasse, die von MainWindow erbt und die das generierte ui Objekt hat), dann habe ich immerhin eine Spalte gefüllt. Das sieht etwa so aus, und funktioniert:
Allerdings wollte ich das ganze ja gerne zweispaltig haben, dazu habe ich folgenden Code im Internet gefunden. Interessant: wenn ich ihn innerhalb des Konstruktors ausführe, dann passiert genau nicht. Keine Fehlermeldung. Beim Starten ist die ColumnView leer. Wenn ich den Code allerdings komplett in meine main.cpp setze, nicht auf die vom QtCreator generierte ui zurückgreife und quasi von Hand das Fenster baue, habe ich eine wundervolle, mit Daten gefüllte ColumnView. Wie bekomme ich das hin, das auch innerhalb meiner Klassen zu machen?PHP-Code:QStringList strList1;
strList1 << "Group 1" << "Group 2" << "Group 3";
QStringListModel* strListM1 = new QStringListModel();
strListM1->setStringList(strList1);
ui->columnView->setModel(strListM1);
Falls es hilft, nochmal der komplette Konstruktor und hier wie es funktioniert, wenn es alleine in der main steht.PHP-Code:QStandardItemModel model;
QStandardItem *name = new QStandardItem("Name");
QStandardItem *firstName = new QStandardItem("First Name");
QStandardItem *lastName = new QStandardItem("Last Name");
name->appendRow(firstName);
name->appendRow(lastName);
model.appendRow(name)
QStandardItem *john = new QStandardItem("John");
QStandardItem *smith = new QStandardItem("Smith");
firstName->appendRow(john);
lastName->appendRow(smith);
QStandardItem *address = new QStandardItem("Address");
QStandardItem *street = new QStandardItem("Street");
QStandardItem *city = new QStandardItem("City");
QStandardItem *state = new QStandardItem("State");
QStandardItem *country = new QStandardItem("Country");
address->appendRow(street);
address->appendRow(city);
address->appendRow(state);
address->appendRow(country);
model.appendRow(address);
ui->tableView->setModel(&model);
Spoiler:
PHP-Code:fenster::fenster(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::fenster)
{
ui->setupUi(this);
/*
QStringList strList1;
strList1 << "Group 1" << "Group 2" << "Group 3";
QStringListModel* strListM1 = new QStringListModel();
strListM1->setStringList(strList1);
ui->columnView->setModel(strListM1); */
QStandardItemModel model;
QStandardItem *name = new QStandardItem("Name");
QStandardItem *firstName = new QStandardItem("First Name");
QStandardItem *lastName = new QStandardItem("Last Name");
name->appendRow(firstName);
name->appendRow(lastName);
model.appendRow(name)
QStandardItem *john = new QStandardItem("John");
QStandardItem *smith = new QStandardItem("Smith");
firstName->appendRow(john);
lastName->appendRow(smith);
QStandardItem *address = new QStandardItem("Address");
QStandardItem *street = new QStandardItem("Street");
QStandardItem *city = new QStandardItem("City");
QStandardItem *state = new QStandardItem("State");
QStandardItem *country = new QStandardItem("Country");
address->appendRow(street);
address->appendRow(city);
address->appendRow(state);
address->appendRow(country);
model.appendRow(address);
ui->columnView->setModel(&model);
}
Vielen Dank für die Hilfe,
kmax
-
08. 02. 2013, 15:19 #2Mitglied
- Registriert seit
- Apr 2012
- Beiträge
- 34
Re: [C++ / Qt] QtCreator Designer: QColumnView hat keinen Inhalt
Versuch mal im Konstruktor statt
folgendes zu schreibenCode:QStandardItemModel model;
und verwende dementsprechend "->" statt "."Code:QStandardItemModel* model = new QStandardItemModel;
-
08. 02. 2013, 16:06 #3Mitglied
(Threadstarter)
- Registriert seit
- Dec 2011
- Beiträge
- 16
Re: [C++ / Qt] QtCreator Designer: QColumnView hat keinen Inhalt
oh, wow!
das funktioniert. dankeschön.
was ich mich aber frage: warum funktioniert das?
-
08. 02. 2013, 16:49 #4Mitglied
- Registriert seit
- Apr 2012
- Beiträge
- 34
Re: [C++ / Qt] QtCreator Designer: QColumnView hat keinen Inhalt
Sicher bin ich mir da auch nicht aber ich schätze mal dass bei
Speicher allokiert wird, ein Zeiger darauf gerichtet wird und dass der Speicher nur mit delete wieder freigegeben werden kann.Code:QStandardItemModel* model = new QStandardItemModel;
Wohingegen bei
der Speicher dafür automatisch freigegeben wird sobal das Object außerhalb des Einflussbereiches in dem es erstellt wurde benutzt wird.Code:QStandardItemModel model
Bin mir da aber nicht sicher
-
08. 02. 2013, 22:39 #5
Re: [C++ / Qt] QtCreator Designer: QColumnView hat keinen Inhalt
Als Grundregel sollte man nie von QObject abgeleitete Objekte auf dem Stack erzeugen, sondern immer auf dem Heap (also mit new) und das Ressourcenmanagement dem Qt-Parentmechanismus überlassen.
Besonders wichtig ist das, wenn man solche Objekte über Qt-Methoden/Objekte hinweg durch die Gegend reicht, denn intern ist Qt nicht auf QObjects auf dem Stack ausgelegt. Auch das automatische Ressourcenmanagement über den Stack/Scope kommt einem dabei sehr gern in die Quere. Das ist das, was Nightrush0179 sagt. Bei:
geht model am Ende des Konstruktors out-of-scope und wird automatisch zerstört. Das passiert bei der Variante in main() genauso. Klappen tut es, weil das Ende von main() erst beim Beenden des Programms erreicht wird.Code:fenster::fenster(QWidget *parent) { QStandardItemModel model; // ... Zeuch }
Also:
Code:---fenster.h--- class fenster: public QMainWindow { // oder so ähnlich Q_OBJECT public: explicit fenster(QWidget *parent = nullptr); // ... mehr Zeuch private: QStandardItemModel *modelM; // ... mehr Zeuch } ---fenster.cpp--- fenster::fenster(QWidget *parent): QMainWindow(parent), modelM(new QStandardItemModel(this)) { // ... mehr Zeuch }Geändert von Larius (09. 02. 2013 um 10:09 Uhr)
-
09. 02. 2013, 09:30 #6Mitglied
(Threadstarter)
- Registriert seit
- Dec 2011
- Beiträge
- 16
Re: [C++ / Qt] QtCreator Designer: QColumnView hat keinen Inhalt
Danke für die ausführliche Antwort, wieder eine Qt-Erfahrung mehr :)
-


Zitieren
mehr lesen...







Anonymous droht mit Angriffen auf...
Heute, 17:02 in gulli:news