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
-
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 ...