PyQt4 4.4.4 : a bug with highlightBlock ?

S

Snouffy

Hello everybody,

I've been trying to do some syntax highlighting using PyQt4. I ported
the example given in the documentation of Qt4 to Python. It works fine
on my computer at work (which has PyQt4 version 4.3.3) but doesn't on
my home computer (which has version 4.4.4) : it gets stuck in an
infinite loop.
Here is the code :

class MyHighlighter(QtGui.QSyntaxHighlighter):
def __init__(self, edit):
QtGui.QSyntaxHighlighter.__init__(self,edit)

def highlightBlock(self, text):
myClassFormat = QtGui.QTextCharFormat()
myClassFormat.setFontWeight(QtGui.QFont.Bold)
myClassFormat.setForeground(QtCore.Qt.darkMagenta)
pattern = "\\b[A-Z_]+\\b"

expression = QtCore.QRegExp(pattern)
index = text.indexOf(expression);
while (index >= 0):
length = expression.matchedLength()
self.setFormat(index, length, myClassFormat)
index = text.indexOf(expression, index + length)


What am I missing ? Is this a known bug of version 4.4.4 ?

Thank you,

Alexis.
 
D

David Boddie

I've been trying to do some syntax highlighting using PyQt4. I ported
the example given in the documentation of Qt4 to Python. It works fine
on my computer at work (which has PyQt4 version 4.3.3) but doesn't on
my home computer (which has version 4.4.4) : it gets stuck in an
infinite loop.

This is a known issue. There are examples distributed with PyQt that should
have been updated to use a slightly different approach.
Here is the code :

class MyHighlighter(QtGui.QSyntaxHighlighter):
def __init__(self, edit):
QtGui.QSyntaxHighlighter.__init__(self,edit)

def highlightBlock(self, text):
myClassFormat = QtGui.QTextCharFormat()
myClassFormat.setFontWeight(QtGui.QFont.Bold)
myClassFormat.setForeground(QtCore.Qt.darkMagenta)
pattern = "\\b[A-Z_]+\\b"

expression = QtCore.QRegExp(pattern)
index = text.indexOf(expression);
while (index >= 0):
length = expression.matchedLength()
self.setFormat(index, length, myClassFormat)
index = text.indexOf(expression, index + length)

You need to change the indexOf() calls to indexIn() calls on the QRegExp
object:

index = expression.indexIn(text, index + length)
What am I missing ? Is this a known bug of version 4.4.4 ?

I think there was a behavioural change at some point that affected regular
expression searching in QStrings.

David
 
S

Snouffy

You need to change the indexOf() calls to indexIn() calls on the QRegExp
object:

  index = expression.indexIn(text, index + length)

Thank you so much ! After looking a bit more I found out that when
using indexOf the command :
length = expression.matchedLength()
was the one causing a problem. Thus I also had to change the line :
index = text.indexOf(expression)
to :
index = expression.indexIn(text)

Now it works like a charm ! I'll test it at work where we have PyQt
4.3.3.

Thanks again !
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,770
Messages
2,569,583
Members
45,073
Latest member
DarinCeden

Latest Threads

Top