Laufzeitfehler bei tableView->setModel()

Alles rund um die Programmierung mit Qt
Antworten
Lichter
Beiträge: 23
Registriert: 20. Januar 2011 12:48

Laufzeitfehler bei tableView->setModel()

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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
Lichter
Beiträge: 23
Registriert: 20. Januar 2011 12:48

Beitrag von Lichter »

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 »

Was hast Du denn geändert?
Lichter
Beiträge: 23
Registriert: 20. Januar 2011 12:48

Beitrag 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.
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Beitrag 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?
Lichter
Beiträge: 23
Registriert: 20. Januar 2011 12:48

Beitrag von Lichter »

Es passiert nichts. Zumindest nicht von meiner Seite aus. Oder wie war die Frage gemeint?
ScyllaIllciz
Beiträge: 200
Registriert: 9. Juli 2010 19:31

Beitrag von ScyllaIllciz »

Schau mal in diese Richtung.
Lichter
Beiträge: 23
Registriert: 20. Januar 2011 12:48

Beitrag 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?
ScyllaIllciz
Beiträge: 200
Registriert: 9. Juli 2010 19:31

Beitrag von ScyllaIllciz »

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 »

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 »

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 »

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 »

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 »

Hallo,
ich hab den Fehler gefunden!
Ich habe setupUi(this); durch ui.SetupUi(this) ersetzt und nun klappt es!
Vielen Dank an alle!!
Antworten