Как правильно назначить контекстное меню для QLabel? - PullRequest
0 голосов
/ 16 апреля 2020

Я новичок в Qt и занимаюсь разработкой приложения PyQt5. Я пытаюсь создать кнопку, используя QLabel, которому назначен svg. Я хотел бы знать, как правильно это сделать? Однако я хочу, чтобы контекстное меню появлялось с помощью левого клика, например кнопки, а также PointingHandCursor в верхней части QLabel, чтобы показать, что на него можно нажимать.

  1. Я пытался использовать mousePressEvent, который назначен функция, которая в свою очередь открывает меню. Это работает, но PointingHandCursor исчезает после первого щелчка. Я нажимаю снова, появляется контекстное меню. В общем, два клика, прежде чем я смог попасть в контекстное меню. Я не могу надежно щелкнуть область метки для отображения контекстного меню каждый раз.

Внутри моего главного окна у меня есть что-то вроде этого:

self.clickable_label.mousePressedEvent = self.open_menu


def open_menu(self, event):
    menu = QMenu(self)
    submenu = QMenu(menu)
    # Add menu at QLabel's position. 

Я также попытался создать собственный класс QLabel, как показано в различных публикациях в Интернете, и назначить контекстное меню или событие при нажатии мышью изнутри, но все же я не могу найти надежный способ открыть контекстное меню, щелкнув левой кнопкой мыши ( думаю, контекстное меню всегда щелкается правой кнопкой мыши (?)).

Одна странная проблема, с которой я постоянно сталкиваюсь и не имею представления о том, что когда я щелкаю свой (svg) QLabel, я вижу очень маленькая выделенная вещь, например da sh, внутри области QLabel. Он движется в зависимости от того, где я нажимаю. У меня точно такой же QLabel без какого-либо замешанного события / меню, прикрепленного к нему, и он не показывает такое поведение. Я предполагаю, что что-то не так с созданием контекста.

Может кто-нибудь показать мне, как подключить щелчок левой кнопкой мыши на QLabel с PointingHandCursor, когда вверху открывается контекстное меню , Я просто sh хочу использовать контекстное меню вместо создания нового виджета для обработки своих собственных пунктов меню.

Спасибо за любые предложения!

Редактировать: Вот пример кода, воспроизводящего мою проблему. Я знаю, что это, скорее всего, работает по неправильным причинам. Я просто хотел бы знать, как я могу это исправить. Я бы хотел, чтобы контекстное меню появлялось только при щелчке левой кнопкой мыши. Я также видел один SO post , в котором говорится, что нельзя использовать прямое назначение mousePressEvent. В конечном счете, моим решением может стать создание собственного виджета меню с использованием пользовательской метки. Любые предложения приветствуются!

import sys
from PyQt5 import QtWidgets, QtGui
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QLabel, QMenu
from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtGui import QCursor

class BasicWindow(QMainWindow):

    def __init__(self):
        super().__init__()

        p = self.palette()
        p.setColor(self.backgroundRole(), Qt.red)
        self.setPalette(p)
        self.labelA = CQLabel(self)
        self.labelA.setPixmap(QtGui.QPixmap('menu_dots.svg'))
        self.setWindowTitle('Label Example')
        self.setGeometry(100, 100, 300, 200)
        self.labelA.move(100, 40)
        self.labelA.mousePressEvent = self.show_menu

    def show_menu(self, e):
        print(e)
        pos = e.pos()
        pos.setX(pos.x())
        pos.setY(pos.y())

        menu = QMenu(self)
        new_doc_menu = QMenu(menu)
        new_doc_menu.setTitle("New document")

        ppt_action = new_doc_menu.addAction("Presentation document")
        text_doc_action = new_doc_menu.addAction("Text document")

        action = menu.exec_(self.labelA.mapToGlobal(pos))

        second_doc_menu = QMenu(menu)
        second_doc_menu.setTitle("Second menu item")
        second_doc_menu.addAction("some action")

        menu.addMenu(new_doc_menu)
        menu.addMenu(second_doc_menu)
        menu.show()

class CQLabel(QLabel):

    clicked = pyqtSignal()

    def __init__(self, *args, **kwargs):
        '''
        Constructor
        '''
        QLabel.__init__(self, *args, **kwargs)
        self.setCursor(QCursor(Qt.PointingHandCursor))
        #self.setContextMenuPolicy(Qt.CustomContextMenu)

    def mousePressEvent(self, e):
        self.clicked.emit()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = BasicWindow()
    ex.show()
    sys.exit(app.exec_())
...