【问题标题】:Qt - QTreeView WordWrap not workingQt - QTreeView WordWrap 不工作
【发布时间】:2010-12-06 23:00:44
【问题描述】:

我一直在一些论坛上阅读有关 WordWrap 不适用于 QTreeView(如屏幕外显示的文本)的信息,但我找不到任何解决此问题的“黑客”。 bookTreeView 被封装在另一个小部件中,这可能是问题......或者它只是不支持?

    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;

【问题讨论】:

  • 您可以使用自己的项目委托在单元格内实现自动换行。您将不得不重新实现 sizeHint 和 paint 方法
  • 这个问题解决了吗?已经快五年了。这是显示目录结构的重要视图类型,似乎自动换行在某些情况下非常有用。
  • 6 年了,我正在寻找同样的东西! Qt5.6

标签: qt mobile qt4 nokia


【解决方案1】:

只有我知道的 hack - 它是 Tree Item 中的 QLable。

【讨论】:

  • 这里也一样..或者有些疯狂地潜入代表..所以qlabel它是,css和所有;-)
【解决方案2】:

根据评论者的建议,您可以使用自定义委托来执行此操作。不幸的是,QTreeView.setWordWrap(True) 似乎没有效果(至少在 Qt 4.8 中)。针对另一个问题,我们使用自定义 QStyledItemDelegate 为 QTreeView 实现了自动换行功能:

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

这只是一种方法,我确信还有其他好的方法,请注意这个示例非常基本,没有编辑器或类似的东西......

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

【讨论】:

  • this attempt at porting your code to Python3/PySide2/Qt5 的工作方式与您编写原始代码时的工作方式完全相同吗?在我的系统(Ubuntu 20.04)上,“Tickle nose...”文本在“Get a job”项后面呈现,无需调整行大小。
  • 对不起,Ruslan,我有一段时间没有做太多 Qt 的东西了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 2016-04-14
  • 1970-01-01
相关资源
最近更新 更多