LINUX.ORG.RU

QTableView и контекстное меню

 ,


0

1

Есть модель, которая грузит данные из БД и представление для нее. Нужно добавить контекстное меню, для добавления и удаления строк в таблицу. Добавления я пока реализовал, но криво, нужно именно через контекстное меню.

Вопрос - как, собственно, в PyQt добавить контектсное меню таблице? На сколько я понимаю, контекстное меню - это QMenu. В него добавляем действия QAction (что они из себя представляют?) и вызываем его в нужном месте. Отсюда следующий вопрос: как вызвать меню? Я хотел бы так - по нажатию правой кнопки мыши. Пробовал переопределить события обработки мышки для формы, но это, видимо, не правильный способ.

Спасибо.

Deleted

я не против твоих тем. это замечательно всё, но ты не пробовал книжку по pyqt4 ?

ggrn ★★★★★
()
Ответ на: комментарий от Ower

Можно еще setContextMenuPolicy(Qt::CustomContextMenu) и ловить сигнал QWidget::customContextMenuRequested ( const QPoint & pos ). В слоте-обработчике этого сигнала можно уже делать что угодно.

grondek
()
Ответ на: комментарий от dimderbin

У меня торренты не работают ни дома, ни на работе. Скачал какую то фигню от этого же автора, там всего 250 страниц. Прямой ссылки не нашел.

Deleted
()
Ответ на: комментарий от anonymous

Лол, я же написал, что искал не только на торрентах.

Deleted
()
Ответ на: комментарий от dimderbin

Ок, в книжке написано:

Чтобы создать контекстное меню, необходимо наследовать класс компонента

Добавил QMenu. Переопределил метод contextMenuEvent:

def contextMenuEvent(self, event):
        print "CONTEXT MENU EVENT"
Не работает. В чем может быть проблема?

Deleted
()
Ответ на: комментарий от arkhnchul

А, я забыл законнектить менюшку. Спасибо.

П.С. В выдаче была одна не посещенная ссылка - в ней и было решение, лол.

Deleted
()
Ответ на: комментарий от arkhnchul

Я таки не понял, кто должен дергать метод contextMenuEvent? В книжке меню вызывается из него, написано, что при нажатии правой кнопки мыши оно должно само вызваться.

В по ссылке оно вызывается через self.customContextMenuRequested.connect(self.contextMenuEvent). При этом, координаты передаются хрен знает откуда. Мне нравится тот вариант, который в книжке описан, но он не пашет, как починить?

class CViewer(QtGui.QTableView, QtGui.QMenu):
    def __init__(self, parent):
        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self._popupMenu = None
        
    def contextMenuEvent(self, event):
        self._popupMenu.exec_(event)
        
    def createPopupMenu(self):
        self._popupMenu = QtGui.QMenu(self)
        self._popupMenu.setObjectName('popupMenu')
        self.customContextMenuRequested.connect(self.contextMenuEvent)
        #Заполнение менюшки
        ...

Я попробовал соединить меню с contextMenuEvent, менюшка все арвно не рисуется.

Deleted
()
Ответ на: комментарий от Deleted

а чем не устраивает ActionsContextMenu - это же требует меньше кода.

Ower
()
Ответ на: комментарий от Deleted

там в первой же ссылке код работоспособной менюшки.

...
    def popup(self, pos):
        for i in self.tv.selectionModel().selection().indexes():
            print i.row(), i.column()
        menu = QMenu()
        quitAction = menu.addAction("Quit")
        action = menu.exec_(self.mapToGlobal(pos))
        if action == quitAction:
            qApp.quit()

    def createTable(self):
        # create the view
        self.tv = QTableView()
        self.tv.setContextMenuPolicy(Qt.CustomContextMenu)
        self.tv.customContextMenuRequested.connect(self.popup)
...

arkhnchul ★★
()
Ответ на: комментарий от Deleted
class CViewer(QtGui.QTableView, QtGui.QMenu):
    def popup(pos)
        menu = QMenu()
        quitAction = menu.addAction("test")
        action = menu.exec_(self.mapToGlobal(pos))

    def __init__(self, parent):
        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.popup)

УМВР вот так.

dimderbin
()
Ответ на: комментарий от dimderbin

QtGui.QMenu тут не нужен таки...

Да, точно.

УМВР вот так.

Ага, я разобрался таки.

Спасибо.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.