Setup description
- Table in PySide created with
QMainWindow - > QWidget -> QTableView -> TableModel (QAbstractTableModel) -> array[[]] - For second column is created ButtonDelegate(QStyledItemDelegate)
Problem description
If button in delegate is disabled [setEnabled(False)], the scrolling of table is not working when mouse is above the disabled button.
Other
When buttons are enabled,everything works well.
In my application, I'm enabling/disabling buttons based on the data.
Scrolling should work in any case, because otherwise the functionality is not user friendly, when scrolling is not working at one of the table columns - with disabled button(s).
I tried few things with eventFilter but nothing worked.
Tested with PySide6 (6.2.2.1), Python 3.9, Windows 10, Debian
Possibly the same problem (but no solution listed):
https://forum.qt.io/topic/123495/disabled-widget-hogs-scrollevents-how-to-disable
Minimal functioning example:
from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout
from PySide6.QtWidgets import QTableView, QWidget, QStyledItemDelegate, QPushButton
from PySide6.QtCore import Qt, QModelIndex, QAbstractTableModel, QItemSelectionModel
class ButtonDelegate(QStyledItemDelegate):
def __init__(self, parent):
QStyledItemDelegate.__init__(self, parent)
def paint(self, painter, option, index):
self.parent().openPersistentEditor(index)
super(ButtonDelegate, self).paint(painter, option, index)
def createEditor(self, parent, option, index):
editor = QPushButton("Button", parent)
editor.setEnabled(False)
return editor
class TableModel(QAbstractTableModel):
def __init__(self, localData=[[]], parent=None):
super().__init__(parent)
self.modelData = localData
def headerData(self, section: int, orientation: Qt.Orientation, role: int):
if role == Qt.DisplayRole:
if orientation == Qt.Vertical:
return "Row " + str(section)
def columnCount(self, parent=None):
return len(self.modelData[0])
def rowCount(self, parent=None):
return len(self.modelData)
def data(self, index: QModelIndex, role: int):
if role == Qt.DisplayRole:
row = index.row()
col = index.column()
return self.modelData[row][col]
app = QApplication()
data = [['1', '2'],['1', '2'],['1', '2'],['1', '2'],['1', '2'],['1', '2'],['1', '2'],
['1', '2'],['1', '2'],['1', '2'],['1', '2'],['1', '2'],['1', '2'],['1', '2'],
['1', '2'],['1', '2'],['1', '2'],['1', '2']]
model = TableModel(data)
tableView = QTableView()
tableView.setModel(model)
selectionModel = QItemSelectionModel(model)
tableView.setSelectionModel(selectionModel)
tableView.setItemDelegateForColumn(1, ButtonDelegate(tableView))
widget = QWidget()
widget.horizontalHeader = tableView.horizontalHeader()
widget.horizontalHeader.setStretchLastSection(True)
widget.mainLayout = QVBoxLayout()
widget.mainLayout.setContentsMargins(1,1,1,1)
widget.mainLayout.addWidget(tableView)
widget.setLayout(widget.mainLayout)
mainWindow = QMainWindow()
mainWindow.setCentralWidget(widget)
mainWindow.setGeometry(0, 0, 300, 300)
mainWindow.show()
exit(app.exec())