[PyQt] [PYQT5]Highlight search results in qtablewidget(select and highlight that text or character not all of the row or column)

Maurizio Berti maurizio.berti at gmail.com
Mon Aug 20 14:39:14 BST 2018

I know you already found a solution, but I decided to give it a try anyway,
just out of curiosity.
I didn't like the idea of using another QWidget, which might involve QStyle
issues, then I found out that it's possible to use QTextDocument.
This is a simple implementation that just matches the text in all items (no
actual search in the model).

class MatchDelegate(QtWidgets.QStyledItemDelegate):
    regex = re.compile('')
    fakeIndex = QtCore.QModelIndex()

    def paint(self, qp, option, index):
        self.initStyleOption(option, index)
        td = QtGui.QTextDocument()
        if self.regex.pattern:
            splitted = self.regex.split(option.text)
            matches = iter(self.regex.findall(option.text))
            text = ''
            for words in splitted[:-1]:
                text += words + '<b>{}</b>'.format(matches.next())
            text += splitted[-1]
            text = option.text
        option.text = ''
        # Using an invalid index avoids painting of the text
        QtWidgets.QStyledItemDelegate.paint(self, qp, option,
        td.drawContents(qp, QtCore.QRectF(0, 0, option.rect.width(),

class Widget(QtWidgets.QWidget):
    def __init__(self):
        self.delegate = MatchDelegate()
        self.search = QtWidgets.QLineEdit()

    def findText(self, text):
        self.delegate.regex = re.compile(text, re.I)

Of course it doesn't take the text size change into account whenever bold
characters are in place, so the sizeHint is not perfect. Also, it might be
possible to implement QFontMetrics' elidedText, again with some small
issues about font size changes.


Il giorno lun 20 ago 2018 alle ore 11:31 Maziar Parsijani <
maziar.parsijani at gmail.com> ha scritto:

> Hi Denis Rouzaud
> This question was for 19days ago.But you are correct the best method is
> html delegate and I did it but I couldn't fix that with my table and the
> table was changed but it worked nice.
> On Mon, Aug 20, 2018 at 12:28 PM, Denis Rouzaud <denis.rouzaud at gmail.com>
> wrote:
>> This is not easily done.
>> You'd have to create a custom delegate using a QLabbel and use html in
>> there.
>> I have been creating a search tool for tables and ending up highlighting
>> the whole cell.
>> The effort and the risk of bad results is just not worth the effort IMHO.
>> Denis
>> Le mar. 31 juil. 2018 à 23:05, Maziar Parsijani <
>> maziar.parsijani at gmail.com> a écrit :
>>> I use method1 to find some text in qtablewidget rows.
>>> method1 :
>>> def FindItem(self):
>>>     items = self.SuraBRS.findItems(
>>>         self.SearchTbox.text(), QtCore.Qt.MatchContains)
>>>     if items:
>>>         results = '\n'.join(
>>>             'row %d column %d' % (item.row() + 1, item.column() + 1)
>>>             for item in items)
>>>     else:
>>>         results = 'Found Nothing'
>>>     print(results)
>>> Now I want to know how to highlight results or change their color.*I
>>> want to select and highlight that text or character not all of the row or
>>> column*.
>>> _______________________________________________
>>> PyQt mailing list    PyQt at riverbankcomputing.com
>>> https://www.riverbankcomputing.com/mailman/listinfo/pyqt
>> --
>> Denis Rouzaud
>> denis at opengis.ch  <denis at opengis.ch>
>> +41 76 370 21 22
> _______________________________________________
> PyQt mailing list    PyQt at riverbankcomputing.com
> https://www.riverbankcomputing.com/mailman/listinfo/pyqt

È difficile avere una convinzione precisa quando si parla delle ragioni del
cuore. - "Sostiene Pereira", Antonio Tabucchi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20180820/af87bf86/attachment.html>

More information about the PyQt mailing list