[PySide] Possbile to syntax hightlight the content of a QTreeWidget item?
Aaron Richiger
a.richi at bluewin.ch
Thu Jan 24 11:35:43 CET 2013
Hello Zhu!
For QTreeWidget, you can use setItemWidget() to set any widget you want
for this item. I used it to place a QLabel with colorized text in the
item. To colorize the text of a QLabel you can use html. To generate the
correct html for any assignment statement with binary operations of any
variable, I implemented a very simple AST model, I guess you have
something similar for your code. All nodes have a to_html() method to
get colorized html output for this node. Here is a simple working example:
################## Code #################
#!/usr/bin/python
import sys
from PySide.QtGui import *
class AstNode(object):
"""Base class for all nodes of the code model."""
def __init__(self):
self.color = "black"
def get_colorized_html_for(self, text):
"""Embed text in html tags setting the text font."""
return '<font color="%s">%s</font>' % (self.color, text)
class Assignment(AstNode):
"""Model for an assignment statement."""
def __init__(self, left, right):
super(Assignment, self).__init__()
self.left = left
self.right = right
def to_html(self):
"""Return html text to represent this node with syntax
highlighting."""
return self.left.to_html() + \
self.get_colorized_html_for(" = ") + \
self.right.to_html()
class BinaryOp(AstNode):
"""Model for a binary operation, such as a + b."""
def __init__(self, left, right, operator):
super(BinaryOp, self).__init__()
self.color = "#0000FF" # example for hex rgb, analogous
to blue
self.left = left
self.right = right
self.operator = operator
def to_html(self):
"""Return html text to represent this node with syntax
highlighting."""
return self.left.to_html() + \
self.get_colorized_html_for(' ' + self.operator + ' ') + \
self.right.to_html()
class Variable(AstNode):
"""Model for a variable."""
def __init__(self, name):
super(Variable, self).__init__()
self.name = name
self.color = "red"
def to_html(self):
"""Return html text to represent this node with syntax
highlighting."""
return self.get_colorized_html_for(self.name)
class TreeWidgetExample(QTreeWidget):
def __init__(self, parent=None):
super(TreeWidgetExample, self).__init__(parent)
self.setHeaderLabels(["Action", "Parameter"])
self.setColumnCount(2)
root = QTreeWidgetItem(self, ["function"])
children = QTreeWidgetItem(root, ["eval"])
# Build code model for $result = $a + $b
result_var = Variable("$result")
a_var = Variable("$a")
b_var = Variable("$b")
addition = BinaryOp(a_var, b_var, "+")
assignment = Assignment(result_var, addition)
# Set a QLable as ItemWidget for the code column
self.setItemWidget(children, 1, QLabel(assignment.to_html(), self))
def main():
app = QApplication(sys.argv)
ex = TreeWidgetExample()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
#################### End Code ##################
Am 24.01.2013 04:03, schrieb ZHONG Zhu:
> I'm using QTreeWidget to parse/show/edit one of our internal
> "language". Now user wants to have syntax highlight feature. I was
> able to highlight the whole item, for instance, the "comment" Action
> and the whole Parameter.
> When it comes to the content within an item, such as "$result = $a +
> $b", I can't find a way to highlight individual variables
> ($result/$a/$b). Anyone has any experience on this? How? Thanks in
> advance!
> BR
> Zhu
>
>
> _______________________________________________
> PySide mailing list
> PySide at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/pyside
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20130124/62c6ec59/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: image/jpeg
Size: 8789 bytes
Desc: not available
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20130124/62c6ec59/attachment.jpe>
More information about the PySide
mailing list