Alles rund um die Programmierung mit Qt
Lichter
Beiträge: 23 Registriert: 20. Januar 2011 12:48
Beitrag
von Lichter » 5. April 2011 09:33
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.
franzf
Beiträge: 3114 Registriert: 31. Mai 2006 11:15
Beitrag
von franzf » 5. April 2011 09:37
Ich nehem an, das steht in einem Konstruktor. Dann darfst du überlegen, wie lange dein model-Objekt lebt.
Stichworte: RAII, Scope, C++ Speichermanagement
Lichter
Beiträge: 23 Registriert: 20. Januar 2011 12:48
Beitrag
von Lichter » 5. April 2011 09:45
Hallo,
erstmal vielen Dank für die schnelle Antwort.
Macht keinen Unterschied.
Woran könnte es noch liegen?
Willi2793
Beiträge: 147 Registriert: 29. September 2008 10:59
Kontaktdaten:
Beitrag
von Willi2793 » 5. April 2011 09:50
Was hast Du denn geändert?
Lichter
Beiträge: 23 Registriert: 20. Januar 2011 12:48
Beitrag
von Lichter » 5. April 2011 09:53
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.
Willi2793
Beiträge: 147 Registriert: 29. September 2008 10:59
Kontaktdaten:
Beitrag
von Willi2793 » 5. April 2011 09:59
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?
Lichter
Beiträge: 23 Registriert: 20. Januar 2011 12:48
Beitrag
von Lichter » 5. April 2011 10:30
Es passiert nichts. Zumindest nicht von meiner Seite aus. Oder wie war die Frage gemeint?
Lichter
Beiträge: 23 Registriert: 20. Januar 2011 12:48
Beitrag
von Lichter » 5. April 2011 11:01
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?
ScyllaIllciz
Beiträge: 200 Registriert: 9. Juli 2010 19:31
Beitrag
von ScyllaIllciz » 5. April 2011 11:06
Wie sieht Dein Code jetzt komplett aus? hast Du aus der Funktion/Konstruktor das "QSqlTableModel model; " raus gemacht und als Klassenmember angelegt?
Lichter
Beiträge: 23 Registriert: 20. Januar 2011 12:48
Beitrag
von Lichter » 5. April 2011 11:11
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)
franzf
Beiträge: 3114 Registriert: 31. Mai 2006 11:15
Beitrag
von franzf » 5. April 2011 11:48
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...
Lichter
Beiträge: 23 Registriert: 20. Januar 2011 12:48
Beitrag
von Lichter » 5. April 2011 11:58
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);
}
franzf
Beiträge: 3114 Registriert: 31. Mai 2006 11:15
Beitrag
von franzf » 5. April 2011 12:04
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 "}".
Lichter
Beiträge: 23 Registriert: 20. Januar 2011 12:48
Beitrag
von Lichter » 5. April 2011 12:11
Hallo,
ich hab den Fehler gefunden!
Ich habe setupUi(this); durch ui.SetupUi(this) ersetzt und nun klappt es!
Vielen Dank an alle!!