【问题标题】:How to make QTableView to enter the editing mode only on double-click如何让QTableView只有双击才能进入编辑模式
【发布时间】:2015-03-26 23:46:50
【问题描述】:

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

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

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

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

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_())

【问题讨论】:

    标签: python model pyqt qtableview


    【解决方案1】:

    您需要在 QTableView 上重新实现偶数处理程序 keyPressEvent。为此,您可以创建一个自定义 QTableView 类并在其中重新实现事件处理程序。

    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    import sys
    
    #Your new customized QTableView
    class CustomQTableView(QTableView):    
        def __init__(self, *args, **kwargs):
            QTableView.__init__(self, *args, **kwargs) #Use QTableView constructor
    
        def keyPressEvent(self, event): #Reimplement the event here, in your case, do nothing
            return
    
    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)
            print "c"
            tableModel=Model(self)               
    
            self.view=CustomQTableView(self) #Call your custom QTableView here
            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_())
    

    这样,keyPressEvent 被覆盖,什么也没有发生,但你的双击事件保持不变。

    【讨论】:

    • 感谢 DrHaze 提供简单的解决方案!
    【解决方案2】:

    我认为更好的解决方案是设置您想要的编辑触发器。由于 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)
    

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 2012-02-06
      • 2022-01-06
      • 2011-04-10
      相关资源
      最近更新 更多