Top ad position

How can I disable expanding on a QTreeView for one row?

Started 2 years ago by M R Alam in Programming Language, Python

I want to make it so that one row does not have the expanding carrot, but can still be selected.

Body

I want to make it so that one row does not have the expanding carrot, but can still be selected.

I tried this:

import sys
from PySide2.QtWidgets import QApplication, QMainWindow, QTreeView, QVBoxLayout, QWidget, QAbstractItemView, QSizePolicy, QStyledItemDelegate
from PySide2.QtCore import Qt, QModelIndex

class CustomItemDelegate(QStyledItemDelegate): def sizeHint(self, option, index): size = super().sizeHint(option, index) if index.row() == self.model.max_display_rows: size.setWidth(0) # Hide the expanding icon return size

class CustomItemModel(QAbstractItemModel): def init(self, data, parent=None): super().init(parent) self.data = data self.max_display_rows = 5

<span class="hljs-comment"># ... (rest of the model methods)</span>

class MainWindow(QMainWindow): def init(self): super().init()

    self.setWindowTitle(<span class="hljs-string">"Custom Item Model Example"</span>)
    self.setGeometry(<span class="hljs-number">100</span>, <span class="hljs-number">100</span>, <span class="hljs-number">400</span>, <span class="hljs-number">300</span>)

    data = [<span class="hljs-string">"Item {}"</span>.<span class="hljs-built_in">format</span>(i) <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>, <span class="hljs-number">11</span>)]

    self.model = CustomItemModel(data)
    self.treeView = QTreeView()
    self.treeView.setModel(self.model)
    self.treeView.setSelectionBehavior(QAbstractItemView.SelectRows)
    self.treeView.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)

    delegate = CustomItemDelegate(self.treeView)
    self.treeView.setItemDelegate(delegate)

    layout = QVBoxLayout()
    layout.addWidget(self.treeView)

    central_widget = QWidget()
    central_widget.setLayout(layout)
    self.setCentralWidget(central_widget)

def main(): app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_())

if name == "main": main()

it doesn't work.

1 Replies

  • Replied 2 years ago

    Report

    You can do something like this to not draw the arrow and not expand the item.

    class TreeView(QTreeView):
    
    <span class="hljs-keyword">def</span> <span class="hljs-title function_">drawBranches</span>(<span class="hljs-params">self, painter, rect, index</span>):
        <span class="hljs-keyword">if</span> index.row() == self.model().max_display_rows:
            <span class="hljs-keyword">return</span> <span class="hljs-comment"># do not draw branch</span>
        <span class="hljs-built_in">super</span>().drawBranches(painter, rect, index)
    

    class MainWindow(QMainWindow): def init(self): ... self.treeView = TreeView() self.treeView.expanded[QModelIndex].connect( lambda index: index.row() == self.treeView.model().max_display_rows and self.treeView.collapse(index) ) # immediately collapse index ...

Bottom ad position