2010-12-06 40 views
4

J'ai lu dans certains des forums sur WordWrap ne fonctionne pas pour QTreeView (comme dans le texte affiche hors écran), mais je ne pouvais pas trouver de "hack" qui a résolu ce problème. Le bookTreeView est encapsulé dans un autre widget, cela peut être le problème ... ou n'est-il pas supporté?Qt - QTreeView WordWrap ne fonctionne pas

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; 
+3

Vous pouvez obtenir un retour à la ligne dans la cellule avec votre propre délégué. Vous devrez réimplémenter sizeHint et peindre les méthodes –

+1

Est-ce que cela a été corrigé? Cela fait presque cinq ans. Ceci est un type de vue important pour l'affichage des structures de répertoires, il semble que le retour à la ligne serait vraiment utile dans certains contextes. – neuronet

+0

6 ans maintenant et je cherche les mêmes choses !! Qt5.6 – Phiber

Répondre

0

Seulement hack je sais - c'est QLable à l'intérieur de l'élément d'arbre. Comme suggéré par un commentateur, vous pouvez le faire en utilisant un délégué personnalisé.

0

Malheureusement, QTreeView.setWordWrap(True) semble n'avoir aucun effet (au moins dans Qt 4.8). En réponse à une autre question, nous avons mis mot fonctionnalité wrap à l'aide d'un QStyledItemDelegate personnalisé pour un QTreeView:

Implementing a delegate for wordwrap in a QTreeView (Qt/PySide/PyQt)?

Ceci est juste une façon de le faire, il y a d'autres bonnes façons je suis sûr, et notez exemple est très basique, pas d'éditeurs ou quoi que ce soit ...

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's 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()