Probleme mit QTableView und QSqlRelationalTableModel

Alles rund um die Programmierung mit Qt
Antworten
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Probleme mit QTableView und QSqlRelationalTableModel

Beitrag von reinki0013 »

hallo zusammen,

also ich habe ein kleines problemchen... :(

und zwar habe ich ein QTableView in der ich eine QSqlRelationalTableModel habe.

und zwar wird schon alles richtig angezeigt...
ein problem das ich jetzt habe äußerst sich wie folgt:

nachdem ich in meiner QTableView in eine Zelle klicke die eine Verknüpfung zu einem anderen Tabelleneintrag hat, und ich diese Zelle verändere und dann "Tab, Enter, einfach irgendwo hinklicke - egal" verschwinden alle Einträge in dieser QTableView die in der selben Spalte (also selbe Verknüpfung) leer sind...
Es werden also nur mehr die Zeilen angezeigt, bei denen in der Spalte wo die Verknüpfung ist auch was drinnen steht - also wo nichts leer ist...
(desweiteren fällt mir auf, dass auf einmal in meinem QTableView-Header bei den Spaltennamen sich was geändert hat)

ja, das is jetzt mein problem bei dem ich net recht weiter weiß...

hatte das jemand von euch schon mal bzw. einen ähnlichen fall?
(über die suchfunktion hab i net wirklich was gefunden)

danke schonmal,

lg
Dateianhänge
Datei bevor ich eine Zelle ändern will
Datei bevor ich eine Zelle ändern will
Vorher.GIF (21.38 KiB) 6245 mal betrachtet
Datei nachdem ich in eine Zelle geklickt habe und danach "irgendwo" hinklicke bzw. enter oder sonstiges gedrückt habe
Datei nachdem ich in eine Zelle geklickt habe und danach "irgendwo" hinklicke bzw. enter oder sonstiges gedrückt habe
Nachher.GIF (26.53 KiB) 6245 mal betrachtet
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

keiner von euch eine idee?
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

::glaskugel::
<nur werbung>
::/glaskugel::

wie wäre es mit etwas minimal code? das kann an vielem liegen ... den queries, eigenen delegates, der vertabelung, ... ::größere glaskugel braucht::
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

in diese funktion komme ich wenn ich den combobox eintrag verändere:

Code: Alles auswählen

void cReglerkonfiguration::ChangeComboBox(QString currentItem)
{
  ui.tableView_configTable->setModel(SetRelations(currentItem));
  // Combo Boxen in der Tabelle anzeigen zur Auswahl
  ui.tableView_configTable->setItemDelegate(new QSqlRelationalDelegate(this));
  ui.tableView_configTable->resizeColumnsToContents();
}
mehr mache ich auch nicht...
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

Minimalbeispiel (Hauptsächlich copy&paste aus http://doc.qt.nokia.com/4.6/sql-relatio ... model.html) : Hier ... bastel da mal weiter ... bei mir tuts so:

widget.h

Code: Alles auswählen

#ifndef WIDGET_H
#define WIDGET_H

#include <QtGui/QWidget>

class QSqlRelationalTableModel;
class QTableView;

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

private:
    QTableView *view;
    QSqlRelationalTableModel * model;
};

#endif // WIDGET_H
widget.cpp

Code: Alles auswählen

#include "widget.h"

#include <QApplication>
#include <QtGui/QVBoxLayout>
#include <QtGui/QTableView>
#include <QtGui/QMessageBox>

#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlTableModel>
#include <QtSql/QSqlRelationalTableModel>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlRelationalDelegate>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    // setup widget
    QVBoxLayout * l = new QVBoxLayout(this);
    view = new QTableView;
    l->addWidget(view);
    setLayout(l);

    // setup connection
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if ( !db.open()) {
        QMessageBox::critical(0, qApp->tr("Cannot open database"),
            qApp->tr("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.\n\n"
                     "Click Cancel to exit."), QMessageBox::Cancel);
        exit(-1); // hard way out
    }

    QSqlQuery query;
    query.exec("create table employee(id int primary key, name varchar(20), city int, country int)");
    query.exec("insert into employee values(1, 'Espen', 5000, 47)");
    query.exec("insert into employee values(2, 'Harald', 80000, 49)");
    query.exec("insert into employee values(3, 'Sam', 100, 1)");

    query.exec("create table city(id int, name varchar(20))");
    query.exec("insert into city values(100, 'San Jose')");
    query.exec("insert into city values(5000, 'Oslo')");
    query.exec("insert into city values(80000, 'Munich')");

    query.exec("create table country(id int, name varchar(20))");
    query.exec("insert into country values(1, 'USA')");
    query.exec("insert into country values(47, 'Norway')");
    query.exec("insert into country values(49, 'Germany')");

    model = new QSqlRelationalTableModel(this,QSqlDatabase::database());
    model->setTable("employee");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->setRelation(2, QSqlRelation("city", "id", "name"));
    model->setRelation(3, QSqlRelation("country", "id", "name"));

    model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
    model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));
    model->setHeaderData(2, Qt::Horizontal, QObject::tr("City"));
    model->setHeaderData(3, Qt::Horizontal, QObject::tr("Country"));

    model->select();

    view->setModel(model);
    view->setItemDelegate(new QSqlRelationalDelegate(view));
    view->resize(view->sizeHint());


    setWindowTitle("Relational Table Model");
    resize(442,138);
}

Widget::~Widget()
{
    view->close();
    model->clear();
    QSqlDatabase::removeDatabase(":memory:");
}
main.cpp

Code: Alles auswählen

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

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}
widget.pro

Code: Alles auswählen

QT += sql
TARGET = widget
TEMPLATE = app
SOURCES += main.cpp \
    widget.cpp
HEADERS += widget.h
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

und sach bescheid wenn du rausbekommen hast wodrans liegt :))
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

also bei meinem programm mache ich eigentlich das selbe, darum verstehe ich net recht warum es nicht funktioniert...

hab mir jetzt auch noch mal die beispiele durchgesehen...
hab leider noch keinen dunst :cry:

sonst noch wer eine idee??

lg
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

also hier nochmal die funktionen:

Code: Alles auswählen

  ui.tableView_configTable->setModel(SetRelations(currentItem));
  // Combo Boxen in der Tabelle anzeigen zur Auswahl
  ui.tableView_configTable->setItemDelegate(new QSqlRelationalDelegate(this));
  //ui.tableView_configTable->resize(ui.tableView_configTable->sizeHint());
  ui.tableView_configTable->resizeColumnsToContents();
und bei setModel rufe ich dann diese Funktion auf:

Code: Alles auswählen

QSqlRelationalTableModel* cReglerkonfiguration::SetRelations(QString tableName)
{
  QSqlRelationalTableModel *model = new QSqlRelationalTableModel(this);
  model->setTable(tableName);

  QModelIndex index = ui.tableView_systemTable->currentIndex();

  // Filter setzen
  QString help = "ID='" + m_System + "'";
  QSqlRecord record;
  if(tableName == "regelung")
  {
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->setFilter(help);

    model->select();
    if(model->rowCount() == 0)
    {
      // Datensatz anlegen
      QModelIndex insertIndex;
      
      int row = insertIndex.row()  == -1 ? 0 : insertIndex.row();
      model->insertRow(row);
      record = model->record(row);
      record.setValue("ID", m_System);

      model->setRecord(row, record);  // Record setzen
      model->submitAll();
    }
  }
  else
  {
    model->setEditStrategy(QSqlTableModel::OnFieldChange);
    model->select();
  }
  help = "SHOW CREATE TABLE `" + tableName.toUpper() + "`";
  QSqlQuery query;
  query.exec(help);

  QSqlRecord rec = query.record();
  QStringList liste, listFK, listConfig;

  m_listConfig.clear();

  while(query.next())
  {
    for(int i = 0; i < rec.count(); i++)
    {
      QString line = query.value(i).toString();     
      liste = line.split("FOREIGN KEY");
      //liste << line;
    }
  }
  // in liste stehen jetzt alle Einträge der Tabelle
  for(int i = 1; i < liste.count(); i++)
  {
    QString help = liste[i];
    QStringList list = help.split(" ");
    for(int y = 0; y < list.count(); y++)
    {
      if(!list[y].contains(" "))
      {
        help = list[y];
        if(help.length())
        {
          // Entfernen der Klammern inkl. Hochkomma
          if(help.contains("(`"))
          {
            if(help.contains("(`ID`)"))
              continue;
            int i = 0;
            i = help.count();
            help.remove(0, 2);
            help.remove(i - 4, 2);
            listFK << help;         // FOREIGN KEY (`name`)
          }
          else if(help.contains("`conf"))
          {
            int z = help.count();
            help.replace("`", "");
            listConfig << help;     // REFERENCES `name`
          }
        }
      }
    }
  }
  m_listConfig = listConfig;
  // in listFK und listConfig stehen jetzt die Texte
  QSqlTableModel mod;
  QString help1, helpConfig;
  QStringList listHeader;
  int iHeaderColumn = 0;
  mod.setTable(tableName);
  for(int i = 0; i < mod.columnCount(); i++)
  {
    help1 = mod.headerData(i, Qt::Horizontal).toString();
    if(help1 != "ID")
    {
      for(int j = 0; j < listFK.count(); j++)
      {
        if(listFK[j] == help1)
        {
          iHeaderColumn = i;
          model->setRelation(iHeaderColumn, QSqlRelation(m_listConfig[j], "ID", "ID"));
          break;
        }
      }
    }        
  }

  return model;
}
vielleicht liegt hier der hund begraben??

vielleicht könnt ihr mir weiterhelfen...

danke
lg
Antworten