QTableView funzt nicht mit QSQLTableModel

Alles rund um die Programmierung mit Qt
Antworten
joschika77
Beiträge: 45
Registriert: 19. Mai 2006 10:36
Wohnort: an der Ostsee

QTableView funzt nicht mit QSQLTableModel

Beitrag 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.

Code: Alles auswählen

   myVehicleModel->select();
Wer kann helfen?

MfG
Wer Wind sät wird Sturm ernten!
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag 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.
joschika77
Beiträge: 45
Registriert: 19. Mai 2006 10:36
Wohnort: an der Ostsee

Beitrag 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

Code: Alles auswählen

removeColumns()
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
Wer Wind sät wird Sturm ernten!
joschika77
Beiträge: 45
Registriert: 19. Mai 2006 10:36
Wohnort: an der Ostsee

Beitrag von joschika77 »

Hab das folgende noch mit ner View gemacht!Dachte das wenigstens das funzt.Aber nix wirds geben!Dann ist die Tabelle leer! :cry:
Wer weiß warum?

MfG
Wer Wind sät wird Sturm ernten!
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Wenn Du immer nur mit Funzeln hantierst, kann Dir auch kein Licht aufgehen :-D
joschika77
Beiträge: 45
Registriert: 19. Mai 2006 10:36
Wohnort: an der Ostsee

Beitrag 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. :evil:

MfG
Wer Wind sät wird Sturm ernten!
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Dafür ist die Query zuständig. Solange Du alles selektierst, wird auch alles angezeigt.
joschika77
Beiträge: 45
Registriert: 19. Mai 2006 10:36
Wohnort: an der Ostsee

Beitrag 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
Wer Wind sät wird Sturm ernten!
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Deine eigene Klasse schreiben und davon ableiten.
Dann haste zugriff auf die Protected Methoden.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Re: QTableView funzt nicht mit QSQLTableModel

Beitrag 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..)
Dateianhänge
das  resultat
das resultat
formedit.png (58.74 KiB) 6194 mal betrachtet
joschika77
Beiträge: 45
Registriert: 19. Mai 2006 10:36
Wohnort: an der Ostsee

Beitrag 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
Wer Wind sät wird Sturm ernten!
joschika77
Beiträge: 45
Registriert: 19. Mai 2006 10:36
Wohnort: an der Ostsee

Beitrag von joschika77 »

Ableitung kann man wohl hier vergessen.
Habs jetzt mit ne Schleife gemacht!
Ist nicht schön aber das klappt wenigstens. :evil:

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
Wer Wind sät wird Sturm ernten!
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag 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...
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag 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;    
                            }

someOne
Beiträge: 3
Registriert: 2. August 2007 16:33

Beitrag 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!
Antworten