#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_())