Suche in QtableView

Alles rund um die Programmierung mit Qt
galilio
Beiträge: 42
Registriert: 19. November 2013 08:16

Suche in QtableView

Beitrag 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
galilio
Beiträge: 42
Registriert: 19. November 2013 08:16

Re: Suche in QtableView

Beitrag 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

}
galilio
Beiträge: 42
Registriert: 19. November 2013 08:16

Re: Suche in QtableView

Beitrag von galilio »

Ist überhaupt meinen Ansatz richtig oder habe ich einen denkfehler?
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Re: Suche in QtableView

Beitrag von MichaelS »

galilio hat geschrieben:Ist überhaupt meinen Ansatz richtig oder habe ich einen denkfehler?
Schau Dir mal die Klasse QSortFilterProxyModel an.
galilio
Beiträge: 42
Registriert: 19. November 2013 08:16

Re: Suche in QtableView

Beitrag von galilio »

Ich komme leider nicht so weiter ....
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Suche in QtableView

Beitrag von Christian81 »

Ich würde nicht im View suchen sondern direkt im Model.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
galilio
Beiträge: 42
Registriert: 19. November 2013 08:16

Re: Suche in QtableView

Beitrag 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

}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Suche in QtableView

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
galilio
Beiträge: 42
Registriert: 19. November 2013 08:16

Re: Suche in QtableView

Beitrag 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.
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Re: Suche in QtableView

Beitrag 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)
galilio
Beiträge: 42
Registriert: 19. November 2013 08:16

Re: Suche in QtableView

Beitrag von galilio »

Ich finde nichts aber einen Hinweis, wird mir schon weiterbringen.

Danke und Sorry für die blöde Fragen
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Re: Suche in QtableView

Beitrag 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.
galilio
Beiträge: 42
Registriert: 19. November 2013 08:16

Re: Suche in QtableView

Beitrag von galilio »

Hallo danke
Es hat funktioniert.
Ich habe noch eine Frage.
Wie kann ich die Tabelle wieder zu den defaultView zurückkehre?
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Re: Suche in QtableView

Beitrag 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.
galilio
Beiträge: 42
Registriert: 19. November 2013 08:16

Re: Suche in QtableView

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