QSqlRelationalDelegate nicht definiert

Alles rund um die Programmierung mit Qt
Antworten
Rusty Spoon
Beiträge: 5
Registriert: 7. März 2008 17:48

QSqlRelationalDelegate nicht definiert

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

Beitrag von franzf »

Existiert denn die Datei "QSqlRelationalDelegate" überhaupt?
Ansonsten kannst du auch die von dir erwähnte "qsqlrelationaldelegate.h" includen.
Rusty Spoon
Beiträge: 5
Registriert: 7. März 2008 17:48

Beitrag 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.
Rusty Spoon
Beiträge: 5
Registriert: 7. März 2008 17:48

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Schon mal im Task-Tracker nachgeschaut?
Rusty Spoon
Beiträge: 5
Registriert: 7. März 2008 17:48

Beitrag von Rusty Spoon »

Danke für den Tipp, wusste gar nicht, dass es sowas gibt. Leider scheint dieser im Moment nicht zu funktionieren. :?
Rusty Spoon
Beiträge: 5
Registriert: 7. März 2008 17:48

Beitrag von Rusty Spoon »

Hm, Task Tracker geht wieder, aber mein Problem ist nicht gelistet.
Antworten