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

Maziar Parsijani maziar.parsijani at gmail.com
Mon Aug 20 15:01:43 BST 2018


Really thanks to Maurizio
I will try this.I agree with you and was thinking if someone had a solution
with re library and regix could be better for me .


On Mon, Aug 20, 2018 at 6:09 PM, Maurizio Berti <maurizio.berti at gmail.com>
wrote:

> 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]
>         else:
>             text = option.text
>         td.setHtml(text)
>         option.text = ''
>         # Using an invalid index avoids painting of the text
>         QtWidgets.QStyledItemDelegate.paint(self, qp, option,
> self.fakeIndex)
>         qp.save()
>         qp.translate(option.rect.topLeft())
>         td.drawContents(qp, QtCore.QRectF(0, 0, option.rect.width(),
> option.rect.height()))
>         qp.restore()
>
>
> class Widget(QtWidgets.QWidget):
>     def __init__(self):
>         [...]
>         self.delegate = MatchDelegate()
>         self.table.setItemDelegate(self.delegate)
>         self.search = QtWidgets.QLineEdit()
>         self.search.textChanged.connect(self.findText)
>         [...]
>
>     def findText(self, text):
>         self.delegate.regex = re.compile(text, re.I)
>         self.table.viewport().update()
>
>
> 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.
>
> Maurizio
>
>
> 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
> http://www.jidesk.net
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20180820/4a15ed84/attachment-0001.html>


More information about the PyQt mailing list