Seite 1 von 1

QSqlRelationalDelegate nicht definiert

Verfasst: 7. März 2008 18:43
von Rusty Spoon
Hallo Community,

ich habe ein Problem mit dem SQL-Modul, soweit läuft alles super, aber die Klasse QSqlRelationalDelegate macht Probleme. Selbst folgender Code:

Code: Alles auswählen

QSqlRelationalDelegate delegate(NULL);
löst ein:
g++ (GCC) 4.1.2 hat geschrieben:Fehler: »QSqlRelationalDelegate« wurde in diesem Gültigkeitsbereich nicht definiert
aus.

Eingebundene Header sind:

Code: Alles auswählen

#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlRelationalTableModel>
#include <QtSql/QSqlRelationalDelegate>
Gelinkte Bibliotheken sind: QtCore, QtDesigner, QtGui und QtSql.

Ich verwende Qt in der OpenSource-Linux-Variante Version 4.3.3. Es ist möglich, aber unwahrscheinlich, dass mein Build Schrott ist. Ich habe Qt4 nativ aus den Fedora-Repositories installiert, auch schon den Source von der Trolltech-Seite gezogen und kompiliert, aber funktioniert hat es dennoch nicht.

Falls es jemanden interessiert, so schaut meine "qsqlrelationaldelegate.h" (im QtSql-Verzeichnis, die Version im Qt-Verzeichnis ist aber identisch) aus:

Code: Alles auswählen

#ifndef QSQLRELATIONALDELEGATE_H
#define QSQLRELATIONALDELEGATE_H

#ifdef QT_GUI_LIB

#include <QtGui/qitemdelegate.h>
#include <QtGui/qlistview.h>
#include <QtGui/qcombobox.h>
#include <QtSql/qsqlrelationaltablemodel.h>

QT_BEGIN_HEADER

QT_MODULE(Sql)

class QSqlRelationalDelegate: public QItemDelegate
{
public:

explicit QSqlRelationalDelegate(QObject *parent = 0)
    : QItemDelegate(parent)
{}

~QSqlRelationalDelegate()
{}

QWidget *createEditor(QWidget *parent,
                      const QStyleOptionViewItem &option,
                      const QModelIndex &index) const
{
    const QSqlRelationalTableModel *sqlModel = qobject_cast<const QSqlRelationalTableModel *>(index.model());
    QSqlTableModel *childModel = sqlModel ? sqlModel->relationModel(index.column()) : 0;
    if (!childModel)
        return QItemDelegate::createEditor(parent, option, index);

    QComboBox *combo = new QComboBox(parent);
    combo->setModel(childModel);
    combo->setModelColumn(childModel->fieldIndex(sqlModel->relation(index.column()).displayColumn()));
    combo->installEventFilter(const_cast<QSqlRelationalDelegate *>(this));

    return combo;
}

void setEditorData(QWidget *editor, const QModelIndex &index) const
{
    const QSqlRelationalTableModel *sqlModel = qobject_cast<const QSqlRelationalTableModel *>(index.model());
    QComboBox *combo = qobject_cast<QComboBox *>(editor);
    if (!sqlModel || !combo) {
        QItemDelegate::setEditorData(editor, index);
        return;
    }
    combo->setCurrentIndex(combo->findText(sqlModel->data(index).toString()));
}

void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    if (!index.isValid())
        return;

    QSqlRelationalTableModel *sqlModel = qobject_cast<QSqlRelationalTableModel *>(model);
    QSqlTableModel *childModel = sqlModel ? sqlModel->relationModel(index.column()) : 0;
    QComboBox *combo = qobject_cast<QComboBox *>(editor);
    if (!sqlModel || !childModel || !combo) {
        QItemDelegate::setModelData(editor, model, index);
        return;
    }

    int currentItem = combo->currentIndex();
    int childColIndex = childModel->fieldIndex(sqlModel->relation(index.column()).displayColumn());
    int childEditIndex = childModel->fieldIndex(sqlModel->relation(index.column()).indexColumn());
    sqlModel->setData(index,
            childModel->data(childModel->index(currentItem, childColIndex), Qt::DisplayRole),
            Qt::DisplayRole);
    sqlModel->setData(index,
            childModel->data(childModel->index(currentItem, childEditIndex), Qt::EditRole),
            Qt::EditRole);
}

};

QT_END_HEADER

#endif // QT_GUI_LIB

#endif // QSQLRELATIONALDELEGATE_H
Auffällig ist einzige, dass einige Methoden direkt in der Header implementiert sind und vor dem Klassennamen (dementsprechend) kein Export-Makro steht. Ich vermute der Fehler hängt damit zusammen. Ich habe auch schon probiert die Klasse neu zu implementieren, indem ich analog zu der Header eine neue Klasse schreibe und die Methoden dabei in einem extra Source-File definiere, hat allerdings auch nichts gebracht.
Google und Forensuche hab ich natürlich benutzt, Google liefert nichts Brauchbares und die Forensuche liefert nur 4 oder 5 Threads zum Stichwort "QSqlRelationalDelegate", die allesamt nichts mit dem Problem zutun haben.

Vielen Dank für eventuelle Hilfe im Voraus, ich hoffe ich habe keine wichtigen Infos vergessen!

Verfasst: 7. März 2008 18:54
von franzf
Existiert denn die Datei "QSqlRelationalDelegate" überhaupt?
Ansonsten kannst du auch die von dir erwähnte "qsqlrelationaldelegate.h" includen.

Verfasst: 7. März 2008 19:14
von Rusty Spoon
Ja, die existiert und bindet die "qsqlrelationaldelegate.h" ein. Lustigerweise erkennt ein Plugin meiner IDE sogar beim Tippen des Klassennamens eben die Klasse, das lässt auch darauf schließen, dass die Header prinzipiell erstmal richtig eingebunden sind.

Edit: Ich habe es eben mal unter Windows getestet aber auch da geht es nicht, gleicher Fehler.

Verfasst: 8. März 2008 21:49
von Rusty Spoon
Es ist vielleicht etwas unverschämt zu fragen, aber könnte eventuell mal jemand testen ob das "QSqlRelationalDelegate" mit Qt 4.3.x prinzipiell funktioniert?

Verfasst: 8. März 2008 21:54
von upsala
Schon mal im Task-Tracker nachgeschaut?

Verfasst: 8. März 2008 22:31
von Rusty Spoon
Danke für den Tipp, wusste gar nicht, dass es sowas gibt. Leider scheint dieser im Moment nicht zu funktionieren. :?

Verfasst: 9. März 2008 16:32
von Rusty Spoon
Hm, Task Tracker geht wieder, aber mein Problem ist nicht gelistet.