Highlight or color a word of string in tableview
-
I have a table view in wich I want to highlight or color a word in it I use this code to make the table view
QStandardItemModel *model = new QStandardItemModel(); model->setHorizontalHeaderItem(0,new QStandardItem(QString("Name"))); model->setHorizontalHeaderItem(1,new QStandardItem(QString("Email"))); QFile file("a.txt"); // contains 7000 name / email , email lenght between 100 500 char file.open(QIODevice::ReadOnly | QIODevice::Text); QTextStream s(&file); while (!s.atEnd()) { QString name = s.readLine(); QString e = s.readLine(); if (e.contains("good")) { // here how to highelight this word !!!!!!!!!!!!!!!! // i try this int start = e.indexOf("good"); int end = start + QString("good").size(); e = e.insert(start,"<font color = \"red\">"); e = e.insert(end,"</font>"); } } ui->tableView->setModel(model);
I try also to add a PlainttextEdit in the column and use QTextCursor + QTextCharFormat to highlight the word
but it take a very very long time reach to 15 minute to show the table and it crashes I want to solve this by anyway to highlight or color the word prefered to highlight
is there any way to to this in qt
Thanks in advance -
@AmrCoder Did you try setForeground for
QStandardItem
? -
The default delegate does not support rich text, you have to implement a custom delegate.
Chapter 5 of "Advanced Qt Programming Creating Great Software with C++ and Qt 4" has a rich text delegate implementation (source code downloadable directly from here) but, imho it's not a great implementation
-
ok thanks for your reply it helps me but I have a small problem when I search I got this code to set the delegate to my table view and use HTML code to color what I want from words inside the table I use this code
class HTMLDelegate : public QStyledItemDelegate { protected: void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const; QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const; }; void HTMLDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex &index) const { QStyleOptionViewItemV4 options = option; initStyleOption(&options, index); painter->save(); QTextDocument doc; doc.setHtml(options.text); options.text = ""; options.widget->style()->drawControl(QStyle::CE_ItemViewItem, &options, painter); painter->translate(options.rect.left(), options.rect.top()); QRect clip(0, 0, options.rect.width(), options.rect.height()); doc.drawContents(painter, clip); painter->restore(); } QSize HTMLDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const { QStyleOptionViewItemV4 options = option; initStyleOption(&options, index); QTextDocument doc; doc.setHtml(options.text); doc.setTextWidth(options.rect.width()); return QSize(doc.idealWidth(), doc.size().height()); }
but after i use this code i use this 2 properties for my tableview
ui->tableView->horizontalHeader()->setSectionResizeMode( QHeaderView::Stretch); ui->tableView->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
so the horizontal stracth so when i resize the tableview it stratched and resize the verticle to content each item with it's content maybe too long maybe short so it appeare like this
when i use the HTMLDelegate class and set it to my tableview like thisdel = new HTMLDelegate(); ui->tableView->setItemDelegate(del);
it appeare like the this
so what edit i should do to make it have the same properties to use html to color the words and in the same time look like the first one