[gelöst] QSqlTableModel mit tableview bleibt leer

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
RogerWilco
Beiträge: 61
Registriert: 26. November 2009 00:08
Kontaktdaten:

[gelöst] QSqlTableModel mit tableview bleibt leer

Beitrag von RogerWilco »

Hallo zusammen,

ich versuche auf eine Postgres-Datenbank zuzugreifen.
Der Beipielcode, den ich als Vorlage genommen hat, tut dies direkt in der main. Das funktioniert auch und öffnet eine Tabelle, die die Daten darstellt. Das funktioniert also...

hier die main: (der Datenbankteil zur Zeit auskommentiert)

Code: Alles auswählen

#include <QtGui/QApplication>
#include "mainwindow.h"

#include <QtGui>


#include <QtSql>
#include <QDebug>



int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();

/*
    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
    db.setHostName("localhost");
    db.setDatabaseName("B6");
    db.setUserName("postgres");
    db.setPassword("postgres");

    if (!db.open())
    {
        QSqlError err = db.lastError();
        QMessageBox::information(0, QObject::tr("Fehler"), err.text());
        return 1;
    }

    QTableView tableView;
    QSqlTableModel model;



    model.setTable("gearset");
    model.select();
    model.setEditStrategy(QSqlTableModel::OnFieldChange);
    tableView.setModel(&model);
    tableView.setWindowTitle("meine erste Datenbank");
    tableView.show();
    return a.exec();
*/

}
Ok, jetzt probiere ich es im mainwindow (erstellt mit dem Assistenten):

Code: Alles auswählen

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QtGui>
#include <QtSql>
#include <QDebug>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
    db.setHostName("localhost");
    db.setDatabaseName("B6");
    db.setUserName("postgres");
    db.setPassword("postgres");

    if (!db.open())
    {
        QSqlError err = db.lastError();
        QMessageBox::information(0, QObject::tr("Fehler"), err.text());
    }

    QSqlTableModel model;

    model.setTable("gearset");
    model.select();
    model.setEditStrategy(QSqlTableModel::OnFieldChange);

    ui->tableView->setModel(&model);
    ui->tableView->show();

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}
Das Tableview wurde im Designer erstellt und wird auch mit "intellisense" gefunden.
Aber die Tabelle bleibt in diesem Fall leider leer.
:cry:

Weiss vielleicht jemand Rat?
Zuletzt geändert von RogerWilco am 28. Februar 2010 14:26, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

C++ Basics...

Code: Alles auswählen

QSqlTableModel model;

model.setTable("gearset");
model.select();
model.setEditStrategy(QSqlTableModel::OnFieldChange);

ui->tableView->setModel(&model);
ui->tableView->show();
Mal wieder die Frage wie lange das Model lebt (und ich wundere mich außerdem dass das Programm nicht crasht).
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
RogerWilco
Beiträge: 61
Registriert: 26. November 2009 00:08
Kontaktdaten:

Beitrag von RogerWilco »

Hallo Christian,

danke für Deine Antwort. Ich sehe mich selber ja als Anfänger, kann aber jetzt nicht wirklich sehen, wo da der große "Basic"-Fehler ist....

Der von Dir zitierte Textteil stammt weitestgehend aus einem Lehrbuch.
Der Unterschied liegt lediglich im Pfeiloperator, statt des Punktoperators.

Wieso sollte das Model am Ende nicht mehr "leben"?
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Beitrag von Willi2793 »

Dann schau Dir nochmal an was die Lebensdauer eines Objektes ist. In Deinem Fall ist die Lebensdauer von "model" interessant.

Und dann überlege mal was die Zeile

Code: Alles auswählen

ui->tableView->setModel(&model);
bewirkt vor allem in Bezug auf eben "model".

Und ich muss auch sagen das mich das nicht crashen des Programmes etwas wundert ;)
RogerWilco
Beiträge: 61
Registriert: 26. November 2009 00:08
Kontaktdaten:

Beitrag von RogerWilco »

Code: Alles auswählen

QSqlTableModel *model = new QSqlTableModel;

    model->setTable("gearset");
    model->select();
    model->setEditStrategy(QSqlTableModel::OnFieldChange);

    ui->tableView->setModel(model);
    ui->tableView->show();
Ahaaa!
Jetzt funktioniert es!
Ganz ehrlich: Die "QSqlTable Class Reference" hat mich mit Euren Hinweisen drauf gebracht.
Aber so ganz klar ist es mir noch nicht.
Hat das Objekt nie existiert, weil ich gar kein Objekt mit "new" angelegt habe?

warum hat dann

Code: Alles auswählen

    QTableView tableView;
    QSqlTableModel model;



    model.setTable("gearset");
    model.select();
    model.setEditStrategy(QSqlTableModel::OnFieldChange);
    tableView.setModel(&model);
    tableView.setWindowTitle("meine erste Datenbank");
    tableView.show();
in der main funktioniert?
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Beitrag von Willi2793 »

Doch, das hat schon existiert. Nur wurde es halt am Ende der Funktion wieder zerstört weil dann ja die Lebensdauer am Ende ist. Bei einem mit "new" angelegtem Objekt ist die Lebensdauer ja solange bis ein "delete" aufgerufen wird (was Du übrigens nicht vergessen solltest oder den "Parent"-Parameter geeignet setzen).

Der Ablauf im Main ist insofern anders als das Du vermutlich dort am Ende durch Aufruf eines "exec()", vermutlich vom MainWindow, die Main-Funktion eben nicht verläßt und damit auch die Lebensdauer des Objektes noch nicht vorbei ist.
RogerWilco
Beiträge: 61
Registriert: 26. November 2009 00:08
Kontaktdaten:

Beitrag von RogerWilco »

An welcher Stelle habe ich denn den Konstruktor schon verlassen und damit die Lebensziet des Objektes überschritten?

Liegt das vielelleicht daran, dass ich das Fenster im Designer erstellt habe und dann mit ui->tableview praktisch in einer anderen Funktion bin, für die das Objekt nicht sichtbar ist? (es würde also noch leben, wäre aber nicht sichtbar?)


Danke, jedenfalls, dass Ihr Euch diesen doch recht newbie-mäßigen Problemen annehmt! :D :oops:
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Beitrag von Willi2793 »

Vergiß mal das Du mit QT als Framework arbeitest und befasse Dich noch mal ganz grundlegend mit dem Thema "Lebensdauer" von C++-Objekten. Das lohnt sich :)
Antworten