Существует другой потенциально более мощный способ сделать это, если вы сделаете шаг и унаследуете представление вместо простого его составления. Работает ли здесь пользовательское контекстное меню? Да, но почему что-то кроме представления должно знать об этом? Это также поможет лучше сформировать ваш код для правильного решения других проблем. В настоящее время реализация не обеспечивает инкапсуляцию, сплоченность или поддержку разделения ответственности. В конце у вас будет один большой шарик, который является антитезой хорошего дизайна.
Я упоминаю об этом, потому что вы, кажется, помещаете всю логику графического интерфейса в эту постоянно растущую основную функцию, и именно по этой причине вы в итоге поместили реализацию sort в вашу модель, что для меня не имеет смысла. (Что, если у вас есть два вида модели, вы заставляете их сортировать одинаково)
Это больше кода? Да, но это дает вам больше силы, которую, я думаю, стоит упомянуть. Ниже я демонстрирую, как обрабатывать заголовки, а также любую ячейку, которую вы хотите. Также обратите внимание, что в моей реализации, если существует некоторый ДРУГОЙ виджет, который также определяет обработчик события контекстного меню, он потенциально может получить шанс обработать событие после моего; так что если кто-то еще добавляет обработчик только для определенных случаев, он может сделать это, не усложняя мой код. Частью этого является маркировка, если вы обработали событие или нет.
Достаточно моих бессвязных мыслей, вот код:
#Alteration : instead of self.tv = QTableView...
self.tv = MyTableView()
....
# somewhere in your TableView object's __init__ method
# yeah IMHO you should be inheriting and thus extending TableView
class MyTableView(QTableView):
def __init__(self, parent = None):
super(MyTableView, self).__init__()
self.setContextMenuPolicy(Qt.DefaultContextMenu)
## uniform one for the horizontal headers.
self.horizontalHeader().setContextMenuPolicy(Qt.ActionsContextMenu)
''' Build a header action list once instead of every time they click it'''
doSomething = QAction("&DoSomething", self.verticalHeader(),
statusTip = "Do something uniformly for headerss",
triggered = SOME_FUNCTION
self.verticalHeader().addAction(doSomething)
...
return
def contextMenuEvent(self, event)
''' The super function that can handle each cell as you want it'''
handled = False
index = self.indexAt(event.pos())
menu = QMenu()
#an action for everyone
every = QAction("I'm for everyone", menu, triggered = FOO)
if index.column() == N: #treat the Nth column special row...
action_1 = QAction("Something Awesome", menu,
triggered = SOME_FUNCTION_TO_CALL )
action_2 = QAction("Something Else Awesome", menu,
triggered = SOME_OTHER_FUNCTION )
menu.addActions([action_1, action_2])
handled = True
pass
elif index.column() == SOME_OTHER_SPECIAL_COLUMN:
action_1 = QAction("Uh Oh", menu, triggered = YET_ANOTHER_FUNCTION)
menu.addActions([action_1])
handled = True
pass
if handled:
menu.addAction(every)
menu.exec_(event.globalPos())
event.accept() #TELL QT IVE HANDLED THIS THING
pass
else:
event.ignore() #GIVE SOMEONE ELSE A CHANCE TO HANDLE IT
pass
return
pass #end of class