简体   繁体   English

如何防止QTableView项在双击时被清除

[英]How to prevent QTableView item from getting cleared on double-click

With QTableView set as editable using QAbstractTableModel's flag() method: 使用QAbstractTableModel的flag()方法将QTableView设置为可编辑状态:

def flags(self, index):
    return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable

double-clicking the QTableView's item puts this item into the editing mode. 双击QTableView的项目将其置于编辑模式。 By default the pre-existing string disappears from the field and an entire item is blank. 默认情况下,先前存在的字符串从字段中消失,整个项目为空白。 I wonder if this behavior can be avoided or overridden? 我想知道这种行为是否可以避免或覆盖?

Here is the QTableView field before the user double-clicks it: 这是用户双击之前的QTableView字段:

在此处输入图片说明

And here is how it looks on double-click: 双击时的外观如下:

在此处输入图片说明

EDITED WORKING CODE (Many thanks to M4rtini ): 编辑后的工作代码(非常感谢M4rtini ):

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys, os

class Model(QAbstractTableModel):
    def __init__(self, parent=None, *args):
        QAbstractTableModel.__init__(self, parent, *args)
        self.items =[ 
                    ['Row0_Column0','Row0_Column1','Row0_Column2'],
                    ['Row1_Column0','Row1_Column1','Row1_Column2'],
                    ['Row2_Column0','Row2_Column1','Row2_Column2']
                    ]

    def flags(self, index):
        return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable

    def rowCount(self, parent):
        return len(self.items)       
    def columnCount(self, parent):
        return 3

    def data(self, index, role):
        if not index.isValid(): return QVariant()
        row=index.row()
        column=index.column()

        if row>len(self.items): return QVariant()        
        if column>len(self.items[row]): return QVariant()

        if role == Qt.EditRole or role == Qt.DisplayRole:
            return QVariant(self.items[row][column])

        return QVariant()

    def setData(self, index, value, role=Qt.EditRole):
        if index.isValid():            
            if role == Qt.EditRole:
                row = index.row()
                column=index.column()
                if row>len(self.items) or column>len(self.items[row]):
                    return False
                else:
                    self.items[row][column]=value  
                    return True
        return False

class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)
        tablemodel=Model(self)               
        tableview=QTableView(self) 
        tableview.setModel(tablemodel)    
        layout=QVBoxLayout(self)
        layout.addWidget(tableview)
        self.setLayout(layout)      

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())

在此处输入图片说明

You need to sett the return value for data when called with EditRole: 使用EditRole调用时,您需要设置数据的返回值:

def data(self, index, role):
    if not index.isValid(): return false
    row=index.row()
    if row>len(self.items): return false

    if role == Qt.DisplayRole or role == Qt.EditRole:
        return self.items[row]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM