如何让QTableView中进入编辑模式仅在双击(How to make QTableView to

2019-10-21 17:01发布

设置一个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_())

Answer 1:

你需要重新实现,甚至处理keyPressEvent您QTableView中。 要做到这一点,你可以创建自定义类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被覆盖,没有任何反应,但你双击事件保持不变。



Answer 2:

我想一个更好的解决办法是设置编辑您想要触发。 作为QTableView中从QAbstractItemView中继承您可以使用无效setEditTriggers(EditTriggers 触发器 )。 因此,对于您的自定义代码QTableView中会是这样:

from PyQt4.QtGui import QAbstractItemView, QTableView

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


文章来源: How to make QTableView to enter the editing mode only on double-click