python - 如何在保持程序化行选择的同时防止用户点击行选择?
问题描述
在我的应用程序中,我有一个 QTableView,其中包含以编程方式选择的行,例如在对数据执行查询之后。
如何防止用户在单击时更改选定的行,同时保持以编程方式选择行的能力?
这是我的代码:
self.table = QTableView()
pandas_model: QAbstractTableModel = PandasTableModel(self.data_frame, self)
self.table.setModel(pandas_model)
self.table.setSortingEnabled(False)
self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # full width table
self.table.setSelectionMode(QAbstractItemView.MultiSelection)
self.table.setSelectionBehavior(QAbstractItemView.SelectRows)
我是否应该覆盖其 ItemSelectionModel 以防止用户单击时的默认行为,同时保持编程选择模式?我怎么能做到这一点?
解决方案
如果您想避免用户可以选择项目、行或列,您应该执行以下操作:
覆盖委托 editorEvent 方法,使其不通知视图单击。
停用单击标题部分的功能
from PyQt5 import QtCore, QtGui, QtWidgets
class Delegate(QtWidgets.QStyledItemDelegate):
def editorEvent(self, event, model, option, index):
res = super(Delegate, self).editorEvent(event, model, option, index)
if event.type() in (
QtCore.QEvent.MouseButtonPress,
QtCore.QEvent.MouseButtonRelease,
QtCore.QEvent.MouseButtonDblClick,
QtCore.QEvent.MouseMove,
QtCore.QEvent.KeyPress
):
return True
return res
class TableView(QtWidgets.QTableView):
def __init__(self, parent=None):
super(TableView, self).__init__(parent)
self.setSortingEnabled(False)
self.horizontalHeader().setSectionResizeMode(
QtWidgets.QHeaderView.Stretch
)
self.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
self.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
delegate = Delegate(self)
self.setItemDelegate(delegate)
self.horizontalHeader().setSectionsClickable(False)
self.verticalHeader().setSectionsClickable(False)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
model = QtGui.QStandardItemModel()
for i in range(15):
for j in range(6):
it = QtGui.QStandardItem("{}-{}".format(i, j))
model.setItem(i, j, it)
table = TableView()
table.setModel(model)
# emulate select by query
import random
for row in random.sample(range(model.rowCount()), 5):
table.selectRow(row)
table.resize(640, 480)
table.show()
sys.exit(app.exec_())
推荐阅读
- javascript - 如何创建一个在输入字段中输入内容后立即启动的计时器
- cpanel - 解析错误:语法错误、意外的“类”(T_CLASS)、需要标识符(T_STRING)或变量(T_VARIABLE)
- javascript - 我可以在浏览器上实时调试任何网站吗?
- ssl - IIS 7.5 多个子域相同的通配符证书
- javascript - 如何在localstorage angulajs中存储按钮值?
- apache-flink - flink流程序中如何使用list等广播变量?
- laravel - 在 laravel 中更新图像不起作用
- java - 如何通过选择某些内容或其他一些操作来更改 JPanel 的内容。
- linux - 如何使用 whm/cpanel 设置单个用户的邮件发送限制
- javascript - Angular 5 - 验证从基础组件派生的自己的输入组件