Seite 1 von 1
QTableView funzt nicht mit QSQLTableModel
Verfasst: 1. Juni 2006 13:52
von joschika77
Hallo!
Ich habe folgendes Problem:
Code: Alles auswählen
QSqlTableModel * ESqlQuery::createVehicleModel(){
QSqlRecord myRecord,myNewRecord;
int myColumn=0,myRow=0;
//int aI[8] = {0,23,26,35,42,43,48,49};
QSqlDatabase myDB = QSqlDatabase::database("con",true);
QSqlTableModel* myVehicleModel = new QSqlTableModel(0,myDB);
myVehicleModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
myVehicleModel->setTable("Vehicle");
//myVehicleModel->select();
myColumn=myVehicleModel->columnCount(QModelIndex());
myRow=myVehicleModel->rowCount(QModelIndex());
QString sQuery = "SELECT idv, \"purchaseDate\",\"purchasePrice\","
"mileage, \"mileageDate\", \"firstDayOfPermission\", "
"\"vehicleName\", \"codePlate\" "
"FROM \"Vehicle\""
"ORDER BY idv";
QSqlQuery query(sQuery,myDB);
myVehicleModel->setQuery(query);// hier protecected,WARUM???
myVehicleModel-> setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
myVehicleModel-> setHeaderData(1, Qt::Horizontal, QObject::tr("Anschaffungsdatum"));
myVehicleModel-> setHeaderData(2, Qt::Horizontal, QObject::tr("Anschaffungspreis"));
myVehicleModel-> setHeaderData(3, Qt::Horizontal, QObject::tr("km-Stand"));
myVehicleModel-> setHeaderData(4, Qt::Horizontal, QObject::tr("Datum km-Stand"));
myVehicleModel-> setHeaderData(5, Qt::Horizontal, QObject::tr("Zulassungsdatum"));
myVehicleModel-> setHeaderData(6, Qt::Horizontal, QObject::tr("Fahrzeugtyp"));
myVehicleModel-> setHeaderData(7, Qt::Horizontal, QObject::tr("Kennzeichen"));
myDB.close();
return myVehicleModel;
}
Hier bekomme ich das SQLModel zurück, welches ich danach mit mit setModel() der tabelle zuweise.Aber er sagt das setQuery() PROTECTED ist.Wie soll ich es sonst machen?
Das folgende hat geklappt.Aber da hab ich alle Spalten,was ich nicht möchte.
Wer kann helfen?
MfG
Verfasst: 1. Juni 2006 14:31
von BartSimpson
Ich habe was zu dem Thema gemacht. Wenn du willst kann dir dir den Kode schicken, wie man Tabelview/QSqlModel/EingeneModelle nutzt.
Das muss protected sein!!
Denn denn das Modell Präsentiert ja die ganze Tabelle.
Und da wird ja denn keine Abfrage mehr benötigt.
In deinem Fall währe die Benutzung von QSqlTableModel::setSort ( int column, Qt::SortOrder order ) angezeigt.
Verfasst: 1. Juni 2006 14:39
von joschika77
Hab das hier gerade gefunden.
Code: Alles auswählen
QSqlTableModel *model = new QSqlTableModel;
model->setTable("Waren");
model->setEditStrategy(QSqlTableModel::OnFieldChange);
model->select();
model->removeColumn(0); // Feld "ID" nicht anzeigen!
model->setHeaderData(0, Qt::Horizontal, QObject::tr("Name"));
model->setHeaderData(1, Qt::Horizontal, QObject::tr("Preis"));
QTableView *view = new QTableView;
view->setModel(model);
view->show();
Aber ich muß viele Colums löschen.
Da gibts dann noch
Dort kann ich aber nur startindex & wieviele angeben,also nur hintereinander weg löschen.Ist für mich also auch schlecht.
Wäre nett wenn du mir was schicken oder posten könntest.
MfG
Verfasst: 1. Juni 2006 15:11
von joschika77
Hab das folgende noch mit ner View gemacht!Dachte das wenigstens das funzt.Aber nix wirds geben!Dann ist die Tabelle leer!
Wer weiß warum?
MfG
Verfasst: 1. Juni 2006 16:22
von macman
Wenn Du immer nur mit Funzeln hantierst, kann Dir auch kein Licht aufgehen

Verfasst: 2. Juni 2006 07:11
von joschika77
Weiß keiner wie ich ne man ne Teilmenge aus der Datenbank bekommt?
Also ich möchte nur einige Spalten im TableViewModel haben.Das muß doch möglich sein.
MfG
Verfasst: 2. Juni 2006 07:25
von macman
Dafür ist die Query zuständig. Solange Du alles selektierst, wird auch alles angezeigt.
Verfasst: 2. Juni 2006 08:09
von joschika77
Das ist schon klar,aber wie oben beschrieben geht das nicht wenn ich ihm meine eigene SELECT Anweisung mitgebe.Der Compiler sagt das die dafür zuständige Methode PROTECTED ist. Was soll ich machen?
MfG
Verfasst: 2. Juni 2006 09:46
von BartSimpson
Deine eigene Klasse schreiben und davon ableiten.
Dann haste zugriff auf die Protected Methoden.
Re: QTableView funzt nicht mit QSQLTableModel
Verfasst: 2. Juni 2006 10:24
von patrik08
joschika77 hat geschrieben:Hallo!
Ich habe folgendes Problem:
Code: Alles auswählen
QSqlQuery query(sQuery,myDB);
myVehicleModel->setQuery(query);// hier protecected,WARUM???
myVehicleModel-> setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
myVehicleModel-> setHeaderData(1, Qt::Horizontal, QObject::tr("Anschaffungsdatum"));
myVehicleModel-> setHeaderData(2, Qt::Horizontal, QObject::tr("Anschaffungspreis"));
myVehicleModel-> setHeaderData(3, Qt::Horizontal, QObject::tr("km-Stand"));
myVehicleModel-> setHeaderData(4, Qt::Horizontal, QObject::tr("Datum km-Stand"));
myVehicleModel-> setHeaderData(5, Qt::Horizontal, QObject::tr("Zulassungsdatum"));
myVehicleModel-> setHeaderData(6, Qt::Horizontal, QObject::tr("Fahrzeugtyp"));
myVehicleModel-> setHeaderData(7, Qt::Horizontal, QObject::tr("Kennzeichen"));
myDB.close();
return myVehicleModel;
}
MfG
Um so wenige felder zu editieren bin ich mir 100% sicher dass ein kunde lieber ein formular will als eine excel/table ... .... so dann kann man direkt funktionen ausnutzen (Da in tableview eine neue row hinzufuegen etwas kompliziert ist).. um neue item hinzufuegen / oder loeschen ... oder als neue row copieren.... mit der findChildren<QComboBox , findChildren<QLineEdit methode ... habe ich ueber 20 felder innert 15 minuten inplementiert ... (ui designer und methode..) beschrieben in
http://www.qtforum.de/forum/viewtopic.php?t=2192 wichtig ist die QLineEdit / QComboBox objektname die selbe namen zu geben wie die db feldnamen.. (vorteil neue felder hinzugen im designer ... muss man im code nichts mehr machen .. da er sowieso alle ausliest..)
Verfasst: 2. Juni 2006 13:38
von joschika77
Deine eigene Klasse schreiben und davon ableiten.
Dann haste zugriff auf die Protected Methoden.
Hab jetzt geerbt von QSqlTableModel, aber hab immernoch keinen Zugriff.
Woran liegt es nun noch?
Code: Alles auswählen
#include <QSqlTableModel>
class EMyModel : public QSqlTableModel
{
Q_OBJECT
public:
EMyModel(QObject * parent = 0, QSqlDatabase db = QSqlDatabase());
~EMyModel(void);
};
MfG
Verfasst: 2. Juni 2006 15:29
von joschika77
Ableitung kann man wohl hier vergessen.
Habs jetzt mit ne Schleife gemacht!
Ist nicht schön aber das klappt wenigstens.
Code: Alles auswählen
QSqlDatabase myDB = QSqlDatabase::database("con",true);
QSqlTableModel* myVehicleModel = new QSqlTableModel(0,myDB);
myVehicleModel->setTable("Vehicle");
myVehicleModel->select();
myColumn=myVehicleModel->columnCount(QModelIndex());
for(int i=myColumn;i>0;i--)
{
if( i != 49 && i != 48 && i != 43 && i != 42 && i != 35 && i!= 26 && i!= 23 && i!= 0)
{
myVehicleModel->removeColumn(i);
}
}
Wenn noch einer einen Vorschlag hat kann er ihn ja posten.
MfG
Verfasst: 2. Juni 2006 17:51
von patrik08
joschika77 hat geschrieben:
Wenn noch einer einen Vorschlag hat kann er ihn ja posten.
MfG
Wer Wind sät wird Sturm ernten!
Was fuer einer sql ist es den oracle , mysql , oder Wind?
mit QSqlQuery query; und..
#include <QSqlQuery>
#include <QSqlRecord>
kann man eine table darstellen auch ohne #include <QSqlTableModel>
und dazu noch signalen .. mache mal ein tablet widget mit dem designer
(die mit edit item) und mit uic den code generieren ... dann kannst du sehen was passiert...
und mit eine difinition von ...
typedef QMap<int, QStringList> resultMap; zum beispiel
kannst du die felder einpacken ... und auslesen.. so wie ein multiarray...
Verfasst: 2. Juni 2006 18:17
von patrik08
ist denn etwa so ... (nicht getestet) geht jedoch einwandfrei mit sqlite3 mit qt4 plug-in...
Code: Alles auswählen
typedef QMap<int, QStringList> resQueryArray;
resQueryArray ClassName::SqlDataGenerator(QString fullquery)
{
resQueryArray res;
QString tablequery = fullquery;
QString line;
QString rowone;
QSqlQuery query;
query.exec(tablequery);
QSqlRecord rec = query.record(); /* nummer col */
int numcol = rec.count();
QStringList RowDataAll;
int loop;
int line = 0 - 1;
while (query.next()) {
RowDataAll.clear();
line++;
qDebug() << "### zeileNr. >> " << line << "##############################";
for(loop=0; loop < numcol; loop++) {
QString felddata = query.value(loop).toString();
qDebug() << "### daten feld >> " << felddata;
RowDataAll.append(felddata);
}
res.insert(line,RowDataAll);
}
return res;
}
/* die taten holen ... */
resQueryArray relist = SqlDataGenerator(QString( "SELECT firma, name, id FROM %1 WHERE ort='%2' and land_code='%3' order by name" ).arg( TABLE_ADDO , pas , coustr));
resQueryArray::Iterator it;
for ( it = relist.begin(); it != relist.end(); ++it ) {
QStringList roxe = it.value();
QString firma = roxe.at(0).toLocal8Bit().constData();
QString name = roxe.at(1).toLocal8Bit().constData();
QString id = roxe.at(2).toLocal8Bit().constData();
/* oder noch einen zeilen for um 0,1,2,3 ecc zu bekommen */
qDebug() << "### die daten Iher weiter im table firma >> " << firma;
}
Verfasst: 2. August 2007 16:50
von someOne
Ein wenig spät aber ich vielleicht steht das Problemm ja immer noch im Raum!?
Wie oben schon angedeutet wurde ist die (in meinen Augen) eleganteste Methode wirklich die Erstellung eines eigenen Models. Da du in deinem ersten codebeispiel sowieso schon SQL benutzt kannst du auch gleich ein eigenes Model implementieren welches genau das abruft was du möchtest.
bsp:
Code: Alles auswählen
class CustomModel : public AbstractTableModel
{
public:
...
void setTableName(QString table);
void setColumns(QList<QString> columnNames);
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
private:
QString m_queryString;
}
so oder so ähnlich würde ichs machen. mit setColumns() sollen die Spaltennamen gesetzt werden die aus der datenbank gelesen werden sollen. wenn diese gestzt wurden wird der SQL-String zusammengesetzt und die Query an die DB abgeschickt. die methoden data() & headerData() liefern dann die entsprechenden Daten aus dem Query! Näheres ist ind er QT-Doku nachzulesen unter model/view!
Darüber hinaus bieten diese Varainte die Möglichlkeit der Wiederverwendung!