Fehler bei Verwendung von QSqlRelationalDelegat

Alles rund um die Programmierung mit Qt
Antworten
Okeanos
Beiträge: 14
Registriert: 16. Juli 2009 20:19

Fehler bei Verwendung von QSqlRelationalDelegat

Beitrag von Okeanos »

Hallo,

ich habe ein Problem mit QSqlRelationalDelegate.

Folgendes kleines Programm soll den Inhalt einer Datenbank darstellen. Das funktioniert auch ganz gut, aber meine Versuche mit QSqlRelationalDelegate eine Combobox in dem QTableView zu erzeigen, scheitert schon beim Kompilieren kläglich.

Der Fehler lautet:
error: expected type-specifier before ‘QSqlRelationalDelegate’
Dabei halte ich mich zimelich präziese an das Beispiel aus der QT-Dokumentation.

MainWindow.h

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>


class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    MainWindow( QWidget *parent = 0 );
    ~MainWindow();
};

#endif
MainWindow.cpp

Code: Alles auswählen

#include <QVBoxLayout>
#include <QTableView>
#include <QSqlRelationalTableModel>
#include <QSqlRelationalDelegate>
#include <QSqlQuery>
#include <QDebug>

#include "MainWindow.h"


MainWindow::MainWindow( QWidget *parent ) : QMainWindow( parent ) {
	QSqlDatabase db = QSqlDatabase::addDatabase( "QSQLITE" );
	db.setDatabaseName( "my.db.sqlite" );
	db.open();

	QSqlQuery query( db );
	query.exec( "CREATE TABLE IF NOT EXISTS Activities (Id INTEGER PRIMARY KEY, ProjectId INTEGER, Description TEXT)" );
	query.exec( "CREATE TABLE IF NOT EXISTS ProjectList (Id INTEGER PRIMARY KEY, Name TEXT)" );
	query.exec( "INSERT INTO Activities (Id, ProjectId, Description) VALUES (1, 1, 'Nothing')" );
	query.exec( "INSERT INTO ProjectList (Id, Name) VALUES (1, 'Building')" );

	QSqlTableModel *model = new QSqlTableModel(this);
	QSqlRelationalTableModel *modelRelational = new QSqlRelationalTableModel(this);

	modelRelational->setTable( "Activities" );
	modelRelational->setRelation(1, QSqlRelation("ProjectList", "Id", "Name"));
	modelRelational->setEditStrategy( QSqlTableModel::OnFieldChange );
	modelRelational->select();
	modelRelational->setHeaderData( 0, Qt::Horizontal, tr( "ID" ) );
	modelRelational->setHeaderData( 1, Qt::Horizontal, tr( "Project" ) );
	modelRelational->setHeaderData( 2, Qt::Horizontal, tr( "Description" ) );

	QTableView *tableViewRelational = new QTableView( this );
	setCentralWidget(tableViewRelational);

	tableViewRelational->setModel( modelRelational );
	tableViewRelational->setItemDelegate( new QSqlRelationalDelegate( tableView ) );
	tableViewRelational->show();
}

MainWindow::~MainWindow() {
}
main.cpp

Code: Alles auswählen

#include <QtGui/QApplication>

#include "MainWindow.h"


int main(int argc, char *argv[]){
	QApplication a(argc, argv);

	MainWindow w;
	w.show();

	return a.exec();
}
Kommentiere ich die Zeile:

Code: Alles auswählen

tableViewRelational->setItemDelegate( new QSqlRelationalDelegate( tableView ) );
aus, kann ich das Beispioel kompilieren, aber natürlich ohne die entsprechende Funktion.

Ich verwende nicht qmake sondern CMake, glaube aber mittels

Code: Alles auswählen

target_link_libraries(SqlTest
	${QT_QTCORE_LIBRARY} 
	${QT_QTGUI_LIBRARY}
	${QT_QTSQL_LIBRARY}
)
alle notwendigen Module eingebunden zu haben.

Kann mir vielleicht jemand auf die Sprünge helfen, wo bei mir der Fehler liegen könnte?
Okeanos
Beiträge: 14
Registriert: 16. Juli 2009 20:19

Beitrag von Okeanos »

Ich habe den Grund für das Problem herausgefunden.

Es lag an der Verwendung von CMake anstelle von qmake. QMake setzt beim Laden des gui-Moduls die Präprozessorvariable QT_GUI_LIB. Cmake tut dies nicht. Und so wird trotz Einbinden der Header-Datei diese nicht wirklich geladen.

Durch Einfügen von

Code: Alles auswählen

ADD_DEFINITIONS(-DQT_GUI_LIB))
in die CMakeLists.txt wird das Problem umgangen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ein
include(${QT_USE_FILE})
setzt alle Variablen korrekt.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Okeanos
Beiträge: 14
Registriert: 16. Juli 2009 20:19

Beitrag von Okeanos »

In der Tat, diese Lösung ist natürlich weitaus besser.
Wieder etwas dazugelernt, vielen Dank.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Bitte auch die Doku dazu in FindQt4.cmake lesen - dort steht wie man es am sinnvollsten benutzt.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten