Skip to main content
 首页 » 编程设计

python之如何让QTableView只有在双击时才进入编辑模式

2025年05月04日14lyhabc

设置一个 Qt.ItemIsEnabled 标志使 QTableView 项目可编辑。 要进入项目的编辑模式,用户只需双击它即可。编辑项目的另一种方法是选择它并按键盘键。 如何禁用进入项目编辑模式的第二种方式?

这是显示选中项目的 QTableView 的图像:

一旦用户按下键盘键,所选项目就已经处于编辑模式:

这种默认的 QTableView 行为使得无法定义功能快捷方式,因为 QListView 的项目没有触发链接到快捷方式的功能,而是进入了编辑模式....如何使 QTableView 仅在 double 上进入编辑模式-点击?

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import sys 
 
class Model(QAbstractTableModel): 
    def __init__(self, parent=None, *args): 
        QAbstractTableModel.__init__(self, parent, *args) 
        self.items = ['Item_A_001','Item_A_002','Item_B_001','Item_B_002'] 
 
    def rowCount(self, parent=QModelIndex()): 
        return len(self.items)        
    def columnCount(self, parent=QModelIndex()): 
        return 1 
 
    def data(self, index, role): 
        if not index.isValid(): return QVariant() 
        elif role != Qt.DisplayRole: 
            return QVariant() 
 
        row=index.row() 
        if row<len(self.items): 
            return QVariant(self.items[row]) 
        else: 
            return QVariant() 
    def flags(self, index): 
        return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable 
 
class MyWindow(QWidget): 
    def __init__(self, *args): 
        QWidget.__init__(self, *args) 
 
        tableModel=Model(self)                
 
        self.view=QTableView(self)  
        self.view.setModel(tableModel) 
        self.view.horizontalHeader().setResizeMode(QHeaderView.Stretch) 
 
        layout = QVBoxLayout(self) 
        layout.addWidget(self.view) 
        self.setLayout(layout) 
 
if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    w = MyWindow() 
    w.show() 
    sys.exit(app.exec_()) 

请您参考如下方法:

我认为更好的解决方案是设置您想要的编辑触发器。由于 QTableView 继承自 QAbstractItemView,您可以使用 void setEditTriggers(EditTriggers triggers)。 所以你的自定义 QTableView 的代码应该是这样的:

from PyQt4.QtGui import QAbstractItemView, QTableView 
 
class CustomQTableView(QTableView):     
    def __init__(self, *args): 
        super().__init__(*args) 
        self.setEditTriggers(QAbstractItemView.NoEditTriggers | 
                             QAbstractItemView.DoubleClicked)