Probleme mit QSqlRelationalTableModel

Alles rund um die Programmierung mit Qt
Antworten
t_b
Beiträge: 41
Registriert: 27. Februar 2010 14:12

Probleme mit QSqlRelationalTableModel

Beitrag von t_b »

Hallo,

Ich versuche gerade meine Datenbank unabhängig (heißt Struktur und i/o weitestgehend aus der ui rauszuhalten) zu machen. Dabei habe ich mich des Beispieles "sqlwidgetmapper" bedient.
Leider bekomme ich es nicht hin z.B. eine Spalte einer Tabelle mit einer Dropbox zu verknüpfen. Hier einmal ein Demoprojekt:

main.cpp

Code: Alles auswählen

#include <QtGui/QApplication>
#include "demogui.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Demogui w;
    w.show();

    return a.exec();
}
demogui.h

Code: Alles auswählen

#ifndef DEMOGUI_H
#define DEMOGUI_H

#include <QMainWindow>
#include "dbconnector.h"


namespace Ui {
    class Demogui;
}

class Demogui : public QMainWindow
{
    Q_OBJECT

public:
    explicit Demogui(QWidget *parent = 0);
    ~Demogui();

private:
    Ui::Demogui *ui;
    dbconnector *db;
};

#endif // DEMOGUI_H
demogui.cpp

Code: Alles auswählen

#include "demogui.h"
#include "ui_demogui.h"
#include "dbconnector.h"
#include "QSqlRelationalTableModel"

Demogui::Demogui(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Demogui)
{
    ui->setupUi(this);
    db = new dbconnector();

    QSqlRelationalTableModel* model = db->getDirectionModel();
    ui->comboBoxDirection->setModel(model);
    ui->comboBoxDirection->setModelColumn(db->getDirectionFieldIndex());

}

Demogui::~Demogui()
{
    delete ui;
    delete db;
}
Die UI Datei habe ich mal ausgespart, da diese nur die entsprechende combobox enthält.

dbconnector.h

Code: Alles auswählen

#ifndef DBCONNECTOR_H
#define DBCONNECTOR_H

#include <QtSql>

class dbconnector
{

public:
    dbconnector();
    ~dbconnector();
    QSqlRelationalTableModel *getDirectionModel();
    int getDirectionFieldIndex();


private:
    QSqlDatabase db;
    QSqlRelationalTableModel *directionModel;

};

#endif // DBCONNECTOR_H
dbconnector.cpp

Code: Alles auswählen

#include "dbconnector.h"
#include <QtSql>
#include <QDebug>

dbconnector::dbconnector()
{
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if (!db.open()) {
        qDebug() <<
               "Unable to establish a database connection.\n"
               "This example needs SQLite support. Please read "
               "the Qt SQL driver documentation for information how "
               "to build it.";
        return;
    }

    QSqlQuery query;


    // Datenbank erstellen

    query.exec("create table person (name varchar(50), birthday date)");
    query.exec("create table testseries (person_id int, comment varchar(255))");
    query.exec("create table testtype (name varchar(10))");
    query.exec("create table subconfig (variable varchar(50), value varchar(255))");
    query.exec("create table config (subconfig_id int, name varchar(20))");
    query.exec("create table config_collection (id int, config_id int, name varchar(20))");
    query.exec("create table test (testseries_id int, testdate date, testtype_id tinyint, config_collection_id int)");
    query.exec("create table direction_key (direction varchar(5))");
    query.exec("create table single_test (test_id int, direction_id tinyint, key_id tinyint, time int)");
    query.exec("insert into testtype (id, name) values (1,'rotation')");
    query.exec("insert into testtype (id, name) values (2,'jump')");
    query.exec("insert into testtype (id, name) values (3,'anti'");
    query.exec("insert into direction_key (id, direction) values (1,'right')");
    query.exec("insert into direction_key (id, direction) values (2,'left')");
    query.exec("insert into direction_key (id, direction) values (3,'up')");
    query.exec("insert into direction_key (id, direction) values (4,'down')");


    // Testdaten generieren

    query.exec("insert into person (name, birthday) values ('Max Mustermann'', '1990-12-24')");

    query.exec("insert into testseries (id, person_id, comment) values (1,1,'Testreihe 2010')");

    query.exec("insert into test (id, testseries_id, testdate, testtype_id) values (1,1,'2010-08-27',1)");
    query.exec("insert into single_test (id, test_id, direction_id, key_id, time) values (1,1,1,1,334");
    query.exec("insert into single_test (id, test_id, direction_id, key_id, time) values (2,1,2,2,434");
    query.exec("insert into single_test (id, test_id, direction_id, key_id, time) values (3,1,4,3,421");
    query.exec("insert into single_test (id, test_id, direction_id, key_id, time) values (4,1,4,4,389");
    query.exec("insert into single_test (id, test_id, direction_id, key_id, time) values (5,1,3,2,405");
    query.exec("insert into single_test (id, test_id, direction_id, key_id, time) values (5,1,2,2,699");

    query.exec("insert into test (id, testseries_id, testdate, testtype_id) values (2,1,'2010-08-28',1)");
    query.exec("insert into single_test (id, test_id, direction_id, key_id, time) values (1,1,1,1,234");
    query.exec("insert into single_test (id, test_id, direction_id, key_id, time) values (2,1,2,2,534");
    query.exec("insert into single_test (id, test_id, direction_id, key_id, time) values (3,1,4,3,441");
    query.exec("insert into single_test (id, test_id, direction_id, key_id, time) values (4,1,4,4,429");
    query.exec("insert into single_test (id, test_id, direction_id, key_id, time) values (5,1,3,2,395");
    query.exec("insert into single_test (id, test_id, direction_id, key_id, time) values (5,1,2,2,546");



}

dbconnector::~dbconnector() {
    db.close();
    QSqlDatabase::removeDatabase("QSQLITE");
}

QSqlRelationalTableModel *dbconnector::getDirectionModel() {
    directionModel = new QSqlRelationalTableModel();
    directionModel->setTable("direction_key");
    return directionModel;
}

int dbconnector::getDirectionFieldIndex() {
    return directionModel->fieldIndex("direction");
}
Antworten