Qt - QTreeView WordWrap not working

I read on some forums that WordWrap doesnโ€™t work for QTreeView (as in the text display outside the screen), but I could not find any โ€œhackโ€ that fixed this. BookTreeView is encapsulated inside another widget, it may be a problem ... or is it simply not supported?

bookTreeView->setModel(standardModel); bookTreeView->setEditTriggers(QAbstractItemView::NoEditTriggers); bookTreeView->setWordWrap(true); bookTreeView->sizeHint(); bookTreeView->setTextElideMode(Qt::ElideNone); bookTreeView->setExpandsOnDoubleClick(true); bookTreeView->setUniformRowHeights(true); bookTreeView->setHeaderHidden(true); bookTreeView->setStyleSheet("QTreeView { font-size: 27px; show-decoration-selected: 0; } QTreeView::branch:has-siblings:!adjoins-item { border-image: none; } QTreeView::branch:has-siblings:adjoins-item { border-image: none; } QTreeView::branch:!has-children:!has-siblings:adjoins-item { border-image: none;} QTreeView::branch:has-children:!has-siblings:closed, QTreeView::branch:closed:has-children:has-siblings { border-image: none; image: url(':images/images/right_arrow.png'); } QTreeView::branch:open:has-children:!has-siblings, QTreeView::branch:open:has-children:has-siblings { border-image: none; image: url(':images/images/down_arrow.png'); } "); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(someWidget); layout->addWidget(bookTreeView); QWidget *page = new QWidget; page->setLayout(layout); return page; 
+4
source share
2 answers

Just hack I know - this is a QLable inside a tree element.

0
source

As suggested by the commentator, you can do this using a custom delegate. Unfortunately, QTreeView.setWordWrap(True) does not seem to have an effect (at least in Qt 4.8). In response to another question, we implemented word wrap functionality with a custom QStyledItemDelegate for QTreeView:

Delegate implementation for wordwrap in QTreeView (Qt / PySide / PyQt)?

This is just one of the ways to do this, there are other good ways, I'm sure, and note that this example is very simple, no editors or anything like that ...

 import sys from PySide import QtGui, QtCore class SimpleTree(QtGui.QTreeView): def __init__(self, parent = None): QtGui.QTreeView.__init__(self, parent) self.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.setGeometry(500,200, 400, 300) self.setUniformRowHeights(False) #optimize: but for word wrap, we don't want this! self.model = QtGui.QStandardItemModel() self.model.setHorizontalHeaderLabels(['Task', 'Description']) self.setModel(self.model) self.rootItem = self.model.invisibleRootItem() item0 = [QtGui.QStandardItem('Sneeze'), QtGui.QStandardItem('You have been blocked up')] item00 = [QtGui.QStandardItem('Tickle nose, this is a very long entry. Row should resize.'), QtGui.QStandardItem('Key first step')] item1 = [QtGui.QStandardItem('<b>Get a job</b>'), QtGui.QStandardItem('Do not blow it')] item2 = [QtGui.QStandardItem("Now let see how this one works. It is medium."), QtGui.QStandardItem('Do not blow it')] self.rootItem.appendRow(item0) item0[0].appendRow(item00) self.rootItem.appendRow(item1) self.rootItem.appendRow(item2) self.setColumnWidth(0,150) self.expandAll() self.setItemDelegate(ItemWordWrap(self)) class ItemWordWrap(QtGui.QStyledItemDelegate): def __init__(self, parent=None): QtGui.QStyledItemDelegate.__init__(self, parent) self.parent = parent def paint(self, painter, option, index): text = index.model().data(index) document = QtGui.QTextDocument() # #print "dir(document)", dir(document) document.setHtml(text) document.setTextWidth(option.rect.width()) #keeps text from spilling over into adjacent rect index.model().setData(index, option.rect.width(), QtCore.Qt.UserRole+1) painter.save() painter.translate(option.rect.x(), option.rect.y()) document.drawContents(painter) #draw the document with the painter painter.restore() def sizeHint(self, option, index): #Size should depend on number of lines wrapped text = index.model().data(index) document = QtGui.QTextDocument() document.setHtml(text) width = index.model().data(index, QtCore.Qt.UserRole+1) if not width: width = 20 document.setTextWidth(width) return QtCore.QSize(document.idealWidth() + 10, document.size().height()) def main(): app = QtGui.QApplication(sys.argv) myTree = SimpleTree() myTree.show() sys.exit(app.exec_()) if __name__ == "__main__": main() 
0
source

All Articles