Hallo,
ich habe gerade mit Hilfe der Model/View Architektur von Qt eine Anwendung implementiert die aus einer QTableView besteht. Die Daten bezieht die Table über ein QSqlTableModel bzw. über eine MS SQL Datenbank. Es besteht die Möglichkeit in den jeweiligen Spalten nach dem Inhalt zu suchen. Bei der Suche kann entweder der ganze Inhalt eines Datensatzes mit dem Suchwort übereinstimmen oder nur ein bestimmter Teil (EQUAL oder LIKE). Ich möchte gerne das der Teil der gefunden wird farblich in der Table gekennzeichnet wird.
Bsp.:
Suche in Spalte "Name" nach "ans"
Tabelle :
Name | Vorname | Straße | PLZ | Ort
Hans | Muster | Testweg | 88000 | Testcity
Ich habe bereits ein Delegate erzeugt und die paint()-Funktion überschrieben. Jetzt fehlt mir ein passende Ansatz um das ganze umzusetzen. Hat vllt jmd einen guten Ratschlag wie man das realisieren könnte. Für konstruktive Hilfe wäre ich sehr dankbar.
Gruß
marvel
QTableView Spalteninhalt farblich markieren
Re: QTableView Spalteninhalt farblich markieren
Hallo nochmal,
ich habe jetzt eine eigene Lösung implementiert, jedoch keine gute. Vllt könnt ihr mir bei der Verbesserung helfen.
_currentColumn beinhaltet den Index der Spalte in der gesucht wird und _pattern beinhaltet das Suchkriterium/Suchwort/Suchpattern
ich habe jetzt eine eigene Lösung implementiert, jedoch keine gute. Vllt könnt ihr mir bei der Verbesserung helfen.
Code: Alles auswählen
void DBDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
{
QString data = index.data(Qt::DisplayRole).toString();
QRectF rect(option.rect.left()+2, option.rect.top(), option.rect.width(), option.rect.height());
QStringList list;
QRectF boundRect;
QString tempString;
if(!_pattern.isEmpty() && index.column() == _currentColumn)
{
list = data.split(_pattern,QString::KeepEmptyParts,Qt::CaseInsensitive);
for(int i=0 ; i<list.size(); i++)
{
if(i == 0)
{
tempString = list.at(i);
painter->setPen(Qt::black);
painter->drawText(rect,option.displayAlignment,tempString);
}
else
{
boundRect = painter->boundingRect(rect,tempString);
tempString += list.at(i);
painter->setPen(Qt::black);
painter->drawText(QRectF(rect.left()+boundRect.width(),rect.top(),rect.width(),rect.height()),option.displayAlignment,list.at(i));
}
if(i != list.size()-1)
{
boundRect = painter->boundingRect(rect,tempString);
tempString += _pattern;
painter->setPen(Qt::red);
painter->drawText(QRectF(rect.left()+boundRect.width(),rect.top(),rect.width(),rect.height()),option.displayAlignment,_pattern);
}
}
}
else
{
painter->setPen(Qt::black);
painter->drawText(rect,option.displayAlignment,data);
}
}