Ergebnis 1 bis 6 von 6
  1. #1
    Mitglied
    Registriert seit
    Dec 2011
    Beiträge
    20
    Danksagungen
    1

    Standard [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:
    PHP-Code:
    QStringList strList1;
    strList1 << "Group 1" << "Group 2" << "Group 3";

    QStringListModelstrListM1 = new QStringListModel();
    strListM1->setStringList(strList1);
    ui->columnView->setModel(strListM1); 
    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:
        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); 
    Falls es hilft, nochmal der komplette Konstruktor und hier wie es funktioniert, wenn es alleine in der main steht.

    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

  2. #2
    Mitglied
    Registriert seit
    Apr 2012
    Beiträge
    55
    Danksagungen
    6

    Standard Re: [C++ / Qt] QtCreator Designer: QColumnView hat keinen Inhalt

    Versuch mal im Konstruktor statt
    Code:
     QStandardItemModel model;
    folgendes zu schreiben
    Code:
     QStandardItemModel* model = new  QStandardItemModel;
    und verwende dementsprechend "->" statt "."

  3. #3
    Mitglied

    (Threadstarter)


    Registriert seit
    Dec 2011
    Beiträge
    20
    Danksagungen
    1

    Standard Re: [C++ / Qt] QtCreator Designer: QColumnView hat keinen Inhalt

    oh, wow!
    das funktioniert. dankeschön.

    was ich mich aber frage: warum funktioniert das?

  4. #4
    Mitglied
    Registriert seit
    Apr 2012
    Beiträge
    55
    Danksagungen
    6

    Standard Re: [C++ / Qt] QtCreator Designer: QColumnView hat keinen Inhalt

    Sicher bin ich mir da auch nicht aber ich schätze mal dass bei
    Code:
    QStandardItemModel* model = new  QStandardItemModel;
    Speicher allokiert wird, ein Zeiger darauf gerichtet wird und dass der Speicher nur mit delete wieder freigegeben werden kann.
    Wohingegen bei
    Code:
    QStandardItemModel model
    der Speicher dafür automatisch freigegeben wird sobal das Object außerhalb des Einflussbereiches in dem es erstellt wurde benutzt wird.

    Bin mir da aber nicht sicher

  5. #5
    deaktivierter Nutzer
    deaktiviertes Benutzerkonto

    Standard 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:

    Code:
    fenster::fenster(QWidget *parent)
    {
        QStandardItemModel model;    
        // ... Zeuch
    }
    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.

    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)

  6. #6
    Mitglied

    (Threadstarter)


    Registriert seit
    Dec 2011
    Beiträge
    20
    Danksagungen
    1

    Standard Re: [C++ / Qt] QtCreator Designer: QColumnView hat keinen Inhalt

    Danke für die ausführliche Antwort, wieder eine Qt-Erfahrung mehr :)

  7.  
     
     

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •