J'ai fait un séparateur. J'ai essayé d'apporter un menu contextuel lorsque la poignée du séparateur est cliqué avec le bouton droit.

Voici le code que j'ai créé. Actuellement, il ne reconnaît pas les clics droits sur la poignée du séparateur. (remarque : ce code met actuellement à jour le nombre si vous cliquez avec le bouton droit dans la première image du séparateur, c'est-à-dire l'image en haut à gauche)

from PyQt5.QtWidgets import *
from PyQt5 import QtGui
from PyQt5.QtCore import Qt


# This class is to create the outer window

class OuterLayout(QMainWindow):
    def __init__(self):
        super().__init__()
        self.window()

    def window(self):
        self.setMinimumSize(1000, 900)
        self.showMaximized()
        self.setWindowIcon(QtGui.QIcon('Images/Logo_small.png'))
        self.setWindowTitle('Splitter')
        self.menu_bar()

        inner_layout = SplitterLayout()
        layout = inner_layout.add_layout()

        self.setCentralWidget(layout)


    def menu_bar(self):
        menu_bar = self.menuBar()

        file_menu = menu_bar.addMenu('File')
        self.file(file_menu)

        edit_menu = menu_bar.addMenu('Edit')
        self.edit(edit_menu)

    def file(self, file):

        new = QAction('New', self)

        file.addAction(new)

    def edit(self, edit):
        pass


# This class creates the splitter window
class SplitterLayout(QWidget):

    def __init__(self):
        super(QWidget, self).__init__()
        self.count = 0
        self.splitter_handle_width = 3 # This is to set the width of the handle

    # This is a method to add a new splitter window
    def add_layout(self):

        left = QFrame()
        left.setFrameShape(QFrame.StyledPanel)

        bottom = QFrame()
        bottom.setFrameShape(QFrame.StyledPanel)

        splitter1 = QSplitter(Qt.Horizontal)
        splitter1.setHandleWidth(self.splitter_handle_width)

        lineedit = QLineEdit()
        lineedit.setStyleSheet('background-color:green')

        splitter1.addWidget(left)
        splitter1.addWidget(lineedit)
        splitter1.setSizes([200, 200])
        print(splitter1.handle(3))

        splitter1.mousePressEvent = self.splitter_clicked

        splitter2 = QSplitter(Qt.Vertical)
        splitter2.setHandleWidth(self.splitter_handle_width)

        splitter2.addWidget(splitter1)
        splitter2.addWidget(bottom)

        return splitter2

    def splitter_clicked(self, event):
        self.count += 1
        print('splitter_double clicked' + str(self.count))

    # def mousePressEvent(self, event):
    #     if event.button == Qt.RightButton:
    #         print('Right mouse clicked')
    #
    #     elif event.button == Qt.LeftButton:
    #         print('Left mouse clicked')


def main():
    splitter = QApplication([])

    outer_layout = OuterLayout()
    outer_layout.show()

    splitter.exec_()


if __name__ == '__main__':
    main()
1
JacksonPro 8 oct. 2020 à 10:01

1 réponse

Meilleure réponse

L'astuce ici est de créer une classe QSplitterHandle personnalisée et de remplacer QSplitterHandle.mousePressEvent et une classe personnalisée QSplitter où vous remplacez createHandle afin qu'elle renvoie le QSplitterHandle personnalisé à la place de la norme, c'est-à-dire

class MySplitter(QSplitter):
    def createHandle(self):
        return MySplitterHandle(self.orientation(), self)


class MySplitterHandle(QSplitterHandle):
    def mousePressEvent(self, event):
        if event.button() == Qt.RightButton:
            print('Right mouse clicked')

        elif event.button() == Qt.LeftButton:
            print('Left mouse clicked')

        super().mousePressEvent(event)

Enfin, pour utiliser le QSplitter personnalisé, vous devez remplacer toutes les occurrences de QSplitter par MySplitter dans SplitterLayout.

2
Heike 8 oct. 2020 à 11:18