Seite 1 von 2

Suche in QtableView

Verfasst: 22. Dezember 2014 07:34
von galilio
Hallo zusammen,

ich habe einen QtableView erstellt, wo ich mir Messadatenbank in einem Table anzeige.
So weit so gut.


Meine Frage ist:

Wenn ich in der Tabelle einen Suchfunktion schreibe (die mir einfach nach einen bestimmten String sucht), worauf soll ich achten?
Wie sieht es mit der Kombinationtasten (CTRL+F) aus?

Danke

Re: Suche in QtableView

Verfasst: 22. Dezember 2014 11:10
von galilio
Ich fange erst mal mit der einfachste Variante:

Ich habe einen Textfield, wo ich meine Suchende String eintippen kann.
dann einen Butten "Search"
wenn ich auf dieses Button drücke und der textfield nich leer dann rufe ich einen Funktion "searchItem(Qstring & item)" von der DataDelegate
Hier einen Codeabschnitt:

MyView: HeaderFile

Code: Alles auswählen

namespace Ui {
    class MyTable;
}

class MyTable: public QDialog
{
	Q_OBJECT
	
public:
	explicit MyTable(QWidget *parent = 0);
	void setColumnWidth();

	~MyTable(void);

	public slots:
		void updateMyTable();
		void search();

private:
	Ui::MyTable *ui;
	DataDelegate *model;

};
MyView : Cpp

[code]
.....


Void MyTable()
{
	if (!ui->lineFind->text().isEmpty())
	{
		model->searchItem(ui->lineFind->text());
	}
}
Header File: DataDelegate:
[code]

class DataDelegate:public QSqlRelationalTableModel
{
public:
	DataDelegate(QObject *parent = 0);
	QVariant data(const QModelIndex &index, int role) const;
	~DataDelegate(void);
	void searchItem(QString &item);
	....
	};
DataDelegate : Cpp

Code: Alles auswählen

void DataDelegate::searchItem(QString &item)
{
	// mir fehlt der einsatz wie ich meine Suche fortsetzen und dann in meine View als selektiert markiere

}

Re: Suche in QtableView

Verfasst: 22. Dezember 2014 11:18
von galilio
Ist überhaupt meinen Ansatz richtig oder habe ich einen denkfehler?

Re: Suche in QtableView

Verfasst: 22. Dezember 2014 11:38
von MichaelS
galilio hat geschrieben:Ist überhaupt meinen Ansatz richtig oder habe ich einen denkfehler?
Schau Dir mal die Klasse QSortFilterProxyModel an.

Re: Suche in QtableView

Verfasst: 22. Dezember 2014 15:55
von galilio
Ich komme leider nicht so weiter ....

Re: Suche in QtableView

Verfasst: 22. Dezember 2014 17:18
von Christian81
Ich würde nicht im View suchen sondern direkt im Model.

Re: Suche in QtableView

Verfasst: 23. Dezember 2014 07:05
von galilio
und wie soll ich meine Suche in Model fortsetzen?
Auf welche Basis sollte meine Suche?
Was ich meine, ob es die Suche in eine bestimmte splte begrenzen soll + sql abfragen?
Ist das was du meinst?

Mein Model sieht so aus:

Code: Alles auswählen

class DataDelegate:public QSqlRelationalTableModel
{
public:
   DataDelegate(QObject *parent = 0);
   QVariant data(const QModelIndex &index, int role) const;
   ~DataDelegate(void);
   void searchItem(QString &item);
   ....
   };
DataDelegate : Cpp

Code: Alles auswählen

void DataDelegate::searchItem(QString &item)
{
   // mir fehlt der einsatz wie ich meine Suche fortsetzen und dann in meine View als selektiert markiere

}

Re: Suche in QtableView

Verfasst: 23. Dezember 2014 10:04
von Christian81
Bau ein eigenes Model, halte dort die Daten und dann kannst du dort auch ordentlich suchen. Setze davor noch ein QSortFilterProxyModel und du kannst die ganze Suche dort unterbringen und sogar noch die Spalten sortieren.

Re: Suche in QtableView

Verfasst: 23. Dezember 2014 11:03
von galilio
Hallo Christian,

danke erst mal für deine Tipps.
Folgende habe ich gemacht :

Code: Alles auswählen

void MyTable::handleFind()
{
	if (!ui->lineFind->text().isEmpty())
	{
		QSortFilterProxyModel *proxy;
		proxy = new QSortFilterProxyModel(this);
		proxy->setSourceModel(model);
		proxy->setFilterFixedString(ui->lineFind->text());
		ui->tableView->setModel(proxy);
		model->select();
	}
}
Ist das was du meinst oder soll ich mir extra eine neue Klasse, die von QSortFilterProxyModel erbt und neue Methoden (Als Virtual)schreiben ?

Das ober beispiel funktioniert aber nur bedingt, da es die Suche nur in der erste Spalte durgeführt ist.

Re: Suche in QtableView

Verfasst: 23. Dezember 2014 12:40
von MichaelS
galilio hat geschrieben: Das ober beispiel funktioniert aber nur bedingt, da es die Suche nur in der erste Spalte durgeführt ist.
Qt hat seine sehr gute Doku - da findest Du auch die Lösung für Dein Problem:
filterKeyColumn : int
This property holds the column where the key used to filter the contents of the source model is read from.

The default value is 0. If the value is -1, the keys will be read from all columns.

Access functions:

int filterKeyColumn() const
void setFilterKeyColumn(int column)

Re: Suche in QtableView

Verfasst: 23. Dezember 2014 13:10
von galilio
Ich finde nichts aber einen Hinweis, wird mir schon weiterbringen.

Danke und Sorry für die blöde Fragen

Re: Suche in QtableView

Verfasst: 23. Dezember 2014 13:39
von MichaelS
galilio hat geschrieben:Ich finde nichts.

Code: Alles auswählen

setFilterKeyColumn( int )
gehört zu QSortFilterProxyModel (hätte ich vielleicht dabei schreiben sollen) und legt die Spalte fest, in der gesucht wird. Wenn Du hier -1 übergibst ( Standard ist 0, also die erste Spalte), dann wird in allen Spalten gesucht.
galilio hat geschrieben:Danke und Sorry für die blöde Fragen
Kein Problem. Es fangen alle 'klein' an.

Re: Suche in QtableView

Verfasst: 23. Dezember 2014 15:04
von galilio
Hallo danke
Es hat funktioniert.
Ich habe noch eine Frage.
Wie kann ich die Tabelle wieder zu den defaultView zurückkehre?

Re: Suche in QtableView

Verfasst: 23. Dezember 2014 17:19
von MichaelS
galilio hat geschrieben:Hallo danke
Es hat funktioniert.
Ich habe noch eine Frage.
Wie kann ich die Tabelle wieder zu den defaultView zurückkehre?
Zunächst einmal würde ich die Suchfunktion nicht als Member der TableView deklarieren, sondern als Member des Widgets, in dem die Tabelle dargestellt wird. Außerdem muss nicht mit jedem Aufruf der Suchfunktion ein neues ProxyModel auf dem Heap angelegt werden. Das ProxyModel kann z.B. im Konstruktor des Widgets erzeugt werden:

Code: Alles auswählen


myWidget::myWidget(....)
{
...
//proxy muss als Member im Header deklariert werden, da es von anderen Member-Funktionen verwendet wird
proxy = new QSortFilterProxyModel( this );
proxy->setSourceModel( model );
ui->tableView->setModel( proxy );

//Das Eingabefeld, in dem der Suchbegriff eingegeben wird, wird mit einem passenden Slot verbunden
connect ( suchButton, SIGNAL ( textChanged ( const QString & ) ), this, SLOT ( slotSuchen ( const QString & ) ) );
...
}


Im Slot wird dann der Suchbegriff an das ProxyModel übergeben:

Code: Alles auswählen

void myWidget::slotSuchen( const QString &suchbegriff )
{
   proxy->setFixedString( suchbegriff );
}
Damit wird das ProxyModel 'on the fly' während der Eingabe eines Suchbegriffes aktualisiert und die Anzeige entsprechend eingeschränkt. Ist das Eingabefeld leer, dann bekommt das ProxyModel einen leeren String, was dazu führt, dass die Daten ungefiltert angezeigt werden.

Re: Suche in QtableView

Verfasst: 23. Dezember 2014 20:55
von galilio
Obwohl ich jetzt nicht am Platz bin, danke ich dir MichaelS.

Da es bald weinachten ist, wünsche ich dir und alle beteiligte in dieses Forum alle guten zu Weinachten.

Besten Grüße aus der Bergen.