Seite 1 von 1
Probleme mit QTableView und QSqlRelationalTableModel
Verfasst: 18. August 2010 11:46
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
Verfasst: 19. August 2010 06:52
von reinki0013
keiner von euch eine idee?
Verfasst: 19. August 2010 08:20
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::
Verfasst: 19. August 2010 14:10
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...
Verfasst: 19. August 2010 16:09
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
Verfasst: 19. August 2010 19:15
von padreigh
und sach bescheid wenn du rausbekommen hast wodrans liegt

)
Verfasst: 25. August 2010 07:34
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
sonst noch wer eine idee??
lg
Verfasst: 25. August 2010 07:39
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