不允许在 pyside 的 QTableView 中复制/粘贴

Posted

技术标签:

【中文标题】不允许在 pyside 的 QTableView 中复制/粘贴【英文标题】:Disallow copy/paste in QTableView in pyside 【发布时间】:2015-09-23 20:38:35 【问题描述】:

我有QTableViewQSqlQueryModel 获取信息并实时显示。问题是,QTableView 允许用户从其中一个字段中复制和粘贴信息。

    projectModel = QtSql.QSqlQueryModel()
    projectModel.setQuery("select * from queue",self.db)
    self.total_rows = projectModel.rowCount()
    projectModel.setHeaderData(0, QtCore.Qt.Horizontal, 'ID cola')
    projectModel.setHeaderData(1, QtCore.Qt.Horizontal, 'Código')

    self.projectView = QtGui.QTableView()
    self.projectView.setModel(projectModel)
    self.projectView.resizeColumnsToContents()
    self.projectView.horizontalHeader().setStretchLastSection(True)

例如,我如何拒绝复制 QTableView 的内容并将其粘贴到文本编辑器中?

【问题讨论】:

【参考方案1】:

您可以像这样将整个表格设为只读:

    self.projectView.setEditTriggers(QAbstractItemView.NoEditTriggers)

编辑

如果您还想防止复制单元格,则需要取消相关的键盘快捷键。下面是一些执行此操作的示例代码:

from PySide import QtGui, QtCore

class Window(QtGui.QWidget):
    def __init__(self, rows, columns):
        super(Window, self).__init__()
        self.table = QtGui.QTableView(self)
        model =  QtGui.QStandardItemModel(rows, columns, self.table)
        for row in range(rows):
            for column in range(columns):
                item = QtGui.QStandardItem('(%d, %d)' % (row, column))
                model.setItem(row, column, item)
        self.table.setModel(model)
        self.table.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.table)
        self.table.installEventFilter(self)

    def eventFilter(self, source, event):
        if (source is self.table and
            event.type() == QtCore.QEvent.KeyPress and
            event == QtGui.QKeySequence.Copy):
            return True
        return super(Window, self).eventFilter(source, event)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window(5, 5)
    window.setGeometry(600, 300, 600, 250)
    window.show()
    sys.exit(app.exec_())

【讨论】:

不起作用,我仍然可以复制单元格内容。尝试在设置模型之前和之后放置它,我仍然可以复制和粘贴单元格内容。 @LeandroPoblet。你是如何复制和粘贴的?我刚刚用QTableViewQStandardItemModel 进行了测试,但我找不到任何方法(无论是否设置编辑触发器)。没有用于复制或粘贴的上下文菜单或键盘快捷键(编辑时除外),所以我不明白你是怎么做的。 我只是在做 Ctrl+C 和 Ctrl+V,没什么特别的。没有你说的上下文菜单,但默认的复制和粘贴快捷方式确实允许我这样做。 @LeandroPoblet。我无法重现。我在答案中添加了一个测试用例,并且没有复制和粘贴快捷方式。请测试我的示例并确认(说明您使用的平台也可能很有用)。 同样的事情,我会尝试在我的本地 Windows 机器上测试它,看看它是否是一个实际的 PySide 问题。

以上是关于不允许在 pyside 的 QTableView 中复制/粘贴的主要内容,如果未能解决你的问题,请参考以下文章

PySide/pyQt 在 QTableView 中显示数据

如何使用 pyside 在 QtableView 单元格中设置数据

PySide + SQLAlchemy 中 QTableView 的“模型”设计

如何使用 pyside2 在 Qtableview 中显示(和格式化)日期时间数据

QTableView 上的 PySide 委托,带有文本和刻度

使用 PySide2 在 QTableView 中设置文本样式