Seite 1 von 1

QTableView sortieren + Drag&Drop

Verfasst: 27. September 2005 10:14
von KunoK
Hallo Leute!
Ich hab da mal zwei Fragen zum Thema QTableView und hoffe, dass mir da jemand helfen kann (QT4):

1. Ich hab mir eine Funktion geschrieben, die eine SQL-Abfrage in einer Tabelle darstellt:

Code: Alles auswählen

void MainFrame::setTable(QSqlQueryModel* model, QTableView* tv, QString tableName){
        model->setQuery("select * from "+tableName);
        tv->setModel(model);
} 
Dies funktioniert auch. Nun möchte ich , dass wenn man auf den Header einer Spalte klickt, sich die Tabelle nach den Einträgen dieser angeklickten Spalte sortiert. Bei QT3 ging das wohl über die Methode QTable::setSorting(true);

Es müsste doch irgendein Signal geben, was ausgelöst wird wenn man auf den Spaltennamen klickt. Falls ja könnte ich ja darauf reagieren und "sort by Spaltenname" in die SQL-Abfrage aufnehmen...

2. Ich möchte, wenn ich auf einen Eintrag klicke, diesen per Drag&Drop in ein anderes Fenster kopieren. Doch schon das "Draggen" funktioniert nicht.

Code: Alles auswählen

tv->setDragEnabled(true);
hat auch keine Wirkung
ich habs dann probiert, wie in den Beispielen mit der Klasse QDrag und dem Überschreiben von

Code: Alles auswählen

mousePressedEvent
bzw

Code: Alles auswählen

mouseMovedEvent
leider ohne Erfolg

Vielen Dank für die Hilfe

Re: QTableView sortieren + Drag&Drop

Verfasst: 27. September 2005 11:04
von macman
KunoK hat geschrieben:Es müsste doch irgendein Signal geben, was ausgelöst wird wenn man auf den Spaltennamen klickt. Falls ja könnte ich ja darauf reagieren und "sort by Spaltenname" in die SQL-Abfrage aufnehmen...
QHeaderView sollte da weiter helfen.
KunoK hat geschrieben:2. Ich möchte, wenn ich auf einen Eintrag klicke, diesen per Drag&Drop in ein anderes Fenster kopieren. Doch schon das "Draggen" funktioniert nicht.
Es hat noch Fehler. Im letzten (compilierbaren :) ) Snapshot ist das deutlich verbessert, aber noch nicht perfekt. Ich hab mich bisher auch nur mit dem Drag&Drop innerhalb eines QTreeWidget beschäftigt und das ist schon fummelig genug. Ich mußte aber auch mehr implementieren, hier ein Ausschnitt:

Code: Alles auswählen

protected:
	virtual void		mousePressEvent(QMouseEvent *event);
	virtual void		mouseReleaseEvent(QMouseEvent *event);
	virtual void		mouseMoveEvent(QMouseEvent *event);
	virtual void		dragMoveEvent(QDragMoveEvent *event);
	virtual void		dropEvent(QDropEvent *event);

Verfasst: 27. September 2005 12:05
von KunoK

Code: Alles auswählen

QHeaderView* hv= tv->horizontalHeader();
connect (hv,SIGNAL(sectionClicked(int)),...,...);
Damit kann man auf einen Klick reagieren, aber so wirklich viel weiter bringt mich das nicht.
Das mit der Model-View-Architektur ist doch relativ komplex. Hätte ich ein QTableWidget könnte ich die gewünschte Funktionalität einfach mit

Code: Alles auswählen

void setSortingEnabled ( bool enable )
erreichen.
Es kann doch nicht sein, dass ich für diese kleine Sache ein neues kompliziertes Model mir ausdenken muss, oder?
Muss mich wohl noch ein bisschen in die neue Architektur reindenken...
Ganz schlechter Stil wäre es wohl die TableView irgendwie in ein TableWidget umzuwandeln :?

Verfasst: 27. September 2005 12:29
von macman
KunoK hat geschrieben:Damit kann man auf einen Klick reagieren, aber so wirklich viel weiter bringt mich das nicht.
Warum nicht? Du machst deine eigene Klasse MyHeaderView, abgeleitet von QHeaderView, und in sectionClicked(int col) kommt ein emit(orderChanged(int col)). Im MainFrame dann noch ein connect(MyHeaderView, SIGNAL(orderChanged(int)), this, orderChanged(int)), fertig. Bißchen Funktionalität in orderChanded muß natürlich noch rein :)

Verfasst: 27. September 2005 13:29
von KunoK
Danke erstmal!

Ich hab das Sortier-Problem jetzt erst mal so gelöst:

Code: Alles auswählen

void MainFrame::setTable(QSqlTableModel* model, QTableView* tv, QString tableName){
	//Version mit QSqlTableModel
	model->setTable(tableName);
        model->setEditStrategy(QSqlTableModel::OnManualSubmit);
	model->setSort(5,Qt::AscendingOrder);
        model->select();
	tv->setModel(model);
	QHeaderView* hv= tv->horizontalHeader();

	connect (hv,SIGNAL(sectionClicked(int)),this,SLOT(sortColumn(int)));
}

void MainFrame::sortColumn(int i){
	modelUrgent->sort(i,Qt::AscendingOrder);
	modelNormal->sort(i,Qt::AscendingOrder);
}
So sortier ich zwar nur in eine Richtung, aber es scheint zu funktionieren (der Königsweg ists nicht, da das QSqlTableModel editierbar ist, was ich aber nicht möchte);

Um das Problem mit Drag & Drop werd ich mich dann jetzt mal kümmern...

Verfasst: 28. März 2006 02:41
von patrik08
Der Teil von trolltech .... sagts :-(

http://www.trolltech.com/products/qt/readyforqt4.html

Code: Alles auswählen


SQL Cursors (QSqlCursor)

In Qt 3, one of the preferred methods of working with SQL is to use a cursor to manipulate the contents of a database. In Qt 4, the preferred method of working with SQL is to use the model/view architecture (QSqlQueryModel and QSqlTableModel) and, as a result, the cursor interface is only supplied in the Q3SqlCursor class.

The easiest way to ensure continuity between Qt 3 and Qt 4 is to use QSqlQuery rather than QSqlCursor, [b]and migrate to QSqlQueryModel later[/b]. 


Das beste vom qt4 ist eben QSqlTableModel ......
auch die relationen von mehr als 2 tabelle verbinden...

QSqlRelationalTableModel acts like QSqlTableModel, but allows columns to be set as foreign keys into other database tables.

ansonsten ist qt3 table immer noch da a und o...

einfach das $QTDIR wechseln bei bedarf von qt4 auf qt3 und mit dem qt3to4 beten..... ja beten.... wen keine sql sind arbeitet das ding gut
ansonsten muss man auf die suche gehen .... was der cccompiler sagt....