该代码创建了一个单独的QTableView。左列预先填充了QLineEdits委托。右列没有填充任何委托。
当左列的QLineEdit被委托点击时,“clicked”信号被委托项目阻止,tableView“cell”永远不会被选中。
为了选择tableView项目,
当左列的QLineEdit被委托点击时,“clicked”信号被委托项目阻止,tableView“cell”永远不会被选中。
为了选择tableView项目,
mousePressEvent
应该能够通过委托项到达tableView。除了第0行以外,所有其他行的索引都不被选中。如何使其对所有模型索引起作用?
from PyQt4.QtCore import *
from PyQt4.QtGui import *
app = QApplication([])
class LineEdit(QTextEdit):
def __init__(self, parent=None):
super(LineEdit, self).__init__(parent)
def mousePressEvent(self, event):
tableView = self.parent().parent()
tableView.mousePressEvent(event)
class Delegate(QItemDelegate):
def createEditor(self, parent, option, index):
return LineEdit(parent)
def onClick(index):
print 'tableView.onClick:', index
tableView = QTableView()
tableView.setModel(QStandardItemModel(4, 2))
tableView.clicked.connect(onClick)
tableView.setItemDelegate(Delegate())
for row in range(4):
tableView.openPersistentEditor(tableView.model().index(row, 0))
tableView.show()
app.exec_()
用户1034749发布的解决方案:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
app = QApplication([])
class LineEdit(QTextEdit):
def __init__(self, parent=None):
super(LineEdit, self).__init__(parent)
def mouseReleaseEvent(self, event):
super(LineEdit, self).mouseReleaseEvent(event)
table = self.parent().parent() # added by me here
tableView.selectRow(0) # to fix the issue with tableView row not getting selected on delegated click.
event.ignore()
def mousePressEvent(self, event):
super(LineEdit, self).mousePressEvent(event)
event.ignore()
class Delegate(QItemDelegate):
def createEditor(self, parent, option, index):
return LineEdit(parent)
def onClick(index):
print 'tableView.onClick:', index
selectedIndexes = tableView.selectionModel().selectedRows()
tableView = QTableView()
tableView.setSelectionBehavior(QTableView.SelectRows)
tableView.setModel(QStandardItemModel(4, 2))
tableView.clicked.connect(onClick)
tableView.setItemDelegate(Delegate())
for row in range(4):
tableView.openPersistentEditor(tableView.model().index(row, 0))
tableView.show()
app.exec_()
mousePressEvent
方法。这很好!但是偶尔点击委托项单元格不会选择tableView行(要复制它:通过单击tableView中的空白区域取消选择所有tableView的行。然后再次单击上次单击的相同委托项。onClick
方法打印出它收到了一个事件。但是该行仍然未被选中)。如何确保每次单击委托项时都选择表行? - alphanumericmouseReleaseEvent
中加入一行代码tableView.selectRow(0)
可以解决选择问题。 - alphanumericQApplication.notify
来捕获所有事件,发送给任何对象,并找出谁偶尔“吃掉”了你的事件。 - fghj