如何让QTableView只有在双击时才进入编辑模式
How to make QTableView to enter the editing mode only on double-click
设置 Qt.ItemIsEnabled
标志使 QTableView
项可编辑。
要进入项目的编辑模式,用户只需双击它即可。另一种编辑项目的方法是 select 它并按键盘键。
如何禁用进入项目编辑模式的第二种方式?
这是显示带有项目 selected:
的 QTableView 的图片
只要用户按下键盘键,select编辑的项目就已经处于编辑模式:
这种默认的 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_())
您需要在 QTableView 上重新实现偶数处理程序 keyPressEvent
。为此,您可以创建自定义 QTableView class 并在其中重新实现事件处理程序。
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 被覆盖,没有任何反应,但您的双击事件保持不变。
我认为更好的解决方案是设置您想要的编辑触发器。由于 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)
设置 Qt.ItemIsEnabled
标志使 QTableView
项可编辑。
要进入项目的编辑模式,用户只需双击它即可。另一种编辑项目的方法是 select 它并按键盘键。
如何禁用进入项目编辑模式的第二种方式?
这是显示带有项目 selected:
的 QTableView 的图片只要用户按下键盘键,select编辑的项目就已经处于编辑模式:
这种默认的 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_())
您需要在 QTableView 上重新实现偶数处理程序 keyPressEvent
。为此,您可以创建自定义 QTableView class 并在其中重新实现事件处理程序。
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 被覆盖,没有任何反应,但您的双击事件保持不变。
我认为更好的解决方案是设置您想要的编辑触发器。由于 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)