Изменение контекстного меню QTableWidgetItem при редактировании

#python #pyqt #pyqt5 #contextmenu #qtablewidgetitem

Вопрос:

Я пытаюсь добавить действия в контекстное меню, которое появляется, когда я щелкаю правой кнопкой мыши при редактировании содержимого ячейки в a QTableWidget . Я попытался переопределить contextMenuEvent() метод из QTableWidget , но он никогда не вызывается в этом контексте. Я также попытался вызвать cellWidget() метод для элементов, но, как я и ожидал, он вернулся None . Я предполагаю, что временный QLineEdit виджет создается всякий раз, когда ячейка находится в режиме редактирования, но не смог найти ничего, чтобы подтвердить это.

Есть ли какой-либо способ доступа к контекстному меню QTableWidgetItem s в режиме редактирования?

Я тщательно просмотрел документацию, но безрезультатно.

Ответ №1:

Контекстное меню, которое вы должны обработать, — это редактор, предоставленный делегатом. Поэтому в этом случае необходимо реализовать QStyledItemDelegate:

 from PyQt5 import QtCore, QtGui, QtWidgets


class StyledItemDelegate(QtWidgets.QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        editor = super().createEditor(parent, option, index)
        if isinstance(editor, QtWidgets.QLineEdit):
            editor.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
            editor.setProperty("index", QtCore.QPersistentModelIndex(index))
            editor.customContextMenuRequested.connect(self.handle_context_menu)
        return editor

    def handle_context_menu(self, pos):
        editor = self.sender()
        if isinstance(editor, QtWidgets.QLineEdit):
            index = editor.property("index")
            menu = editor.createStandardContextMenu()
            action = menu.addAction("New Action")
            action.setProperty("index", index)
            action.triggered.connect(self.handle_add_new_action_triggered)
            menu.exec_(editor.mapToGlobal(pos))

    def handle_add_new_action_triggered(self):
        action = self.sender()
        if isinstance(action, QtWidgets.QAction):
            index = action.property("index")
            print(index.row(), index.column(), index.data())


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    view = QtWidgets.QTableWidget(3, 5)
    delegate = StyledItemDelegate(view)
    view.setItemDelegate(delegate)
    view.resize(640, 480)
    view.show()

    sys.exit(app.exec_())