如何使QTableView仅在双击时才能进入编辑模式 [英] How to make QTableView to enter the editing mode only on double-click
问题描述
设置Qt.ItemIsEnabled
标志可使QTableView
项目可编辑.
要进入项目的编辑模式,用户只需双击它即可.编辑项目的另一种方法是选择它并按键盘键.
如何禁用进入项目编辑模式的第二种方式?
Setting a Qt.ItemIsEnabled
flag makes the QTableView
items editable.
To enter the item's editing mode the user can simply double-click it. Another way to edit the item is to select it and press a keyboard key.
How to disable this second way of entering the item's editing mode?
这是显示带有选定项目的QTableView的图像:
Here is the image showing the QTableView with the item selected:
用户按下键盘键后,所选项目已处于编辑模式:
As soon as the user presses the keyboard key the selected item is already in the edit mode:
此默认的QTableView行为使无法定义函数快捷方式,因为QListView的项不是触发链接到快捷方式的函数,而是进入编辑模式....如何使QTableView仅在double上进入编辑模式单击?
This default QTableView behavior makes it impossible to define the functions shortcuts since instead of triggering the linked-to-shortcut function the QListView's item enters the editing mode.... How to make QTableView to enter the editing mode only on the double-click?
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上重新实现偶数处理程序keyPressEvent
.为此,您可以创建一个自定义QTableView类并在其中重新实现事件处理程序.
you need to reimplement the even handler keyPressEvent
on your QTableView. To do so, you can create a custom QTableView class and reimplement the event handler inside it.
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被覆盖,什么也没有发生,但是您的双击事件保持不变.
This way, the keyPressEvent is overwritten and nothing happens, but your double click event remains the same.
这篇关于如何使QTableView仅在双击时才能进入编辑模式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!