Seite 1 von 1

Fehler bei Verwendung von QSqlRelationalDelegat

Verfasst: 14. Juni 2011 23:25
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?

Verfasst: 27. Juni 2011 19:40
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.

Verfasst: 27. Juni 2011 20:18
von Christian81
Ein
include(${QT_USE_FILE})
setzt alle Variablen korrekt.

Verfasst: 27. Juni 2011 23:34
von Okeanos
In der Tat, diese Lösung ist natürlich weitaus besser.
Wieder etwas dazugelernt, vielen Dank.

Verfasst: 28. Juni 2011 08:34
von Christian81
Bitte auch die Doku dazu in FindQt4.cmake lesen - dort steht wie man es am sinnvollsten benutzt.