Seite 1 von 1
Laufzeitfehler bei tableView->setModel()
Verfasst: 5. April 2011 09:33
von Lichter
Guten Morgen,
ich habe zurzeit ein Problem mit QSqlTableModel.
Sobald ich versuche tableView->setModel aufzurufen, stürtzt das Programm direkt nach dem Compilieren ab.
Mein Code ist folgender:
Code: Alles auswählen
QSqlTableModel model;
model.setTable("Protokoll");
model.select();
model.setEditStrategy(QSqlTableModel::OnFieldChange);
ui.tableView->setModel(&model);
Das seltsame ist, dass wenn ich setModel() auskommentiere, das Programm wunderbar läuft?!
Ich bin für jede Hilfe dankbar.
Verfasst: 5. April 2011 09:37
von franzf
Ich nehem an, das steht in einem Konstruktor. Dann darfst du überlegen, wie lange dein model-Objekt lebt.
Stichworte: RAII, Scope, C++ Speichermanagement
Verfasst: 5. April 2011 09:45
von Lichter
Hallo,
erstmal vielen Dank für die schnelle Antwort.
Macht keinen Unterschied.
Woran könnte es noch liegen?
Verfasst: 5. April 2011 09:50
von Willi2793
Was hast Du denn geändert?
Verfasst: 5. April 2011 09:53
von Lichter
Den Code aus dem Konstruktor raus, in eine eigene Funktion.
Probeweise in main() aufgerufen und über den Konstruktor aufgerufen. Beides führt zum selben Fehler.
PS: Ich verwende Visual Studio 2008 Express und die Qt Version 4.7.2.
Verfasst: 5. April 2011 09:59
von Willi2793
Den Code unverändert in eine andere Funktion zu verschieben ändert an der Lenbensdauer des Models nicht. Was passiert denn mit Deinem Model wenn die Funktion beendet ist?
Verfasst: 5. April 2011 10:30
von Lichter
Es passiert nichts. Zumindest nicht von meiner Seite aus. Oder wie war die Frage gemeint?
Verfasst: 5. April 2011 10:52
von ScyllaIllciz
Schau mal in
diese Richtung.
Verfasst: 5. April 2011 11:01
von Lichter
Ok, hab die Variable QSqlTableModel model in der Klasse public und static gemacht, dennoch der selbe Fehler?
Edit: Damit sollte die Lebensdauer und die Sichtbarkeit gegeben sein, oder?
Verfasst: 5. April 2011 11:06
von ScyllaIllciz
Wie sieht Dein Code jetzt komplett aus? hast Du aus der Funktion/Konstruktor das "QSqlTableModel model; " raus gemacht und als Klassenmember angelegt?
Verfasst: 5. April 2011 11:11
von Lichter
hast Du aus der Funktion/Konstruktor das "QSqlTableModel model; " raus gemacht und als Klassenmember angelegt?
Ja.
In der Klasse steht jetzt:
QSqlTableModel model;
und die Funktion ist:
Code: Alles auswählen
model.setTable("Protokoll");
model.select();
model.setEditStrategy(QSqlTableModel::OnFieldChange);
ui.tableView->setWindowTitle("Test");
ui.tableView->setModel(&model);
Die Funktion wird über eine Instanz der Klasse aufgerufen. ( in main)
Verfasst: 5. April 2011 11:48
von franzf
Bitte mehr Code, am besten ein (kompilierbares) Minimalbeispiel. An den paar Fetzen kann man nicht wirklich ausmachen, was falsch läuft.
Die Objekte in ui wurden durch ein korrektes "ui.setupUi(this);" scho initialisiert? Nicht dass der Crash nur an dem ui.tableView liegt...
Verfasst: 5. April 2011 11:58
von Lichter
Hallo,
ja, ui.setupUi(this) wird ausgeführt!
Hier der vollständige Code (ist nicht sehr viel):
1. main
Code: Alles auswählen
#include <QApplication>
#include "MainWindow.hxx"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Window window; // Instanz des Hauptfensters
window.SetupConnection();
window.fillTable();
window.show(); // Fenster anzeigen
return app.exec();
}
2. MainWindow.hxx
Code: Alles auswählen
#include "ui_mainwindow.hpp"
#include <QtGui>
#include <QObject>
#include <QApplication>
#include <QtSql>
class Window : public QMainWindow, private Ui::MainWindow
{
Q_OBJECT
public:
Ui::MainWindow ui;
Window(QWidget *parent = 0);
void SetupConnection(); // Datenbank Verbindung(en) aufbauen!
void fillTable();
QSqlTableModel model;
};
3. MainWindow
Code: Alles auswählen
#include "MainWindow.hxx"
#include <QtGui>
#include <QtSql>
Window::Window(QWidget *parent)
{
ui.setupUi(this);
setupUi(this);
}
void Window::SetupConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); // QSQLITE ist der Datenbanktreiber in Stringform
db.setDatabaseName("Protokoll_final.db"); // SQLite Datei öffnen
if(!db.open())
{
// Fehler, keine Verbindung
QMessageBox::warning(this, "Fehler beim Aufbau der Verbindung", "Es konnte keine Verbindung aufgebaut werden!", QMessageBox::Ok);
}
void Window::fillTable()
{
//QSqlTableModel model;
model.setTable("Protokoll");
model.select();
//model.setEditStrategy(QSqlTableModel::OnFieldChange);
//ui.tableView->setWindowTitle("Test");
ui.tableView->setModel(&model);
}
Verfasst: 5. April 2011 12:04
von franzf
Uiuiui ^^
Es gibt 3 verschieden Möglichkeiten, die ui auf ein Widget zu bringen:
1) direct approach
2) composition
3) private inheritance
Wobei immer nur EINER angewandt werden soll.
Du machst sowohl 2 als auch 3 auf einmal.
Lass mal einen davon weg (am einfachsten den 3er).
Und nach der Implementierung von void Window::SetupConnection() fehlt noch eine schließende "}".
Verfasst: 5. April 2011 12:11
von Lichter
Hallo,
ich hab den Fehler gefunden!
Ich habe setupUi(this); durch ui.SetupUi(this) ersetzt und nun klappt es!
Vielen Dank an alle!!