Как передать mousePressEvent из QItemDelegate в QTableView

Код создает один QTableView. Левый столбец предварительно заполнен делегатами QLineEdits. Правый столбец не заполнен никакими делегатами.

Когда щелкнут делегированный QLineEdit левого столбца, сигнал «щелкнул» блокируется делегированным элементом, а «ячейка» tableView никогда не выбирается.

Чтобы элемент 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_()

person alphanumeric    schedule 07.05.2016    source источник


Ответы (1)


чтобы пройти через событие, вам нужно просто игнорировать его, например:

 def mouseReleaseEvent(self, event):
        print "mouse release"
        super(LineEdit, self).mouseReleaseEvent(event)
        event.ignore()

 def mousePressEvent(self, event):
        print "mouse press"
        super(LineEdit, self).mousePressEvent(event)
        event.ignore()
person fghj    schedule 07.05.2016
comment
Все, что я хочу, это убедиться, что ячейка tableView выбрана, когда вы щелкаете делегированную ячейку QLineEdit (левый столбец). Пожалуйста, покажите, как этого добиться, не делая странных вещей. - person alphanumeric; 07.05.2016
comment
Я разместил ваше решение в разделе «Предложения, сделанные другими» в моем первоначальном вопросе. Ваш подход работает. Но он неправильно выбирает строку tableView. - person alphanumeric; 07.05.2016
comment
Щелчок по делегированному элементу никогда не пропускает метод delegateds mousePressEvent. Это отлично! Но время от времени щелчок по ячейке делегированного элемента не выбирает строку tableView (чтобы реплицировать ее: отмените выбор всех строк tableView, щелкнув пустую область в tableView. Затем щелкните тот же делегированный элемент, который был выбран в прошлый раз. Метод onClick печатает что он получает событие. Но строка остается невыбранной.). Как убедиться, что строка таблицы выбирается каждый раз, когда нажимается делегированный элемент? - person alphanumeric; 07.05.2016
comment
добавление строки tableView.selectRow(0) в mouseReleaseEvent устраняет проблему выбора. - person alphanumeric; 07.05.2016
comment
Решение .selectRow(0) не будет работать с изменениями клавиш Ctrl или Shift - person alphanumeric; 07.05.2016
comment
@spootnx Вы можете переопределить QApplication.notify, чтобы перехватывать все события, отправлять на любые объекты и узнавать, кто eat ваше событие once in a while - person fghj; 07.05.2016