在 PyQt5 python 中的拆分器手柄上创建右键单击菜单



我做了一个拆分器。我一直在尝试在右键单击拆分器手柄时引入右键单击菜单。

这是我创建的代码。目前,它无法识别拆分器手柄上的右键单击。(注意:如果在拆分器的第一帧中单击鼠标右键,则此代码当前会更新计数,即左上角帧)

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

这里的诀窍是创建一个自定义QSplitterHandle类并覆盖QSplitterHandle.mousePressEvent和一个自定义QSplitter类,您可以在其中覆盖createHandle,以便它返回自定义QSplitterHandle而不是标准,即

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)

最后,要使用自定义QSplitter,您需要将所有出现的QSplitter替换为SplitterLayout中的MySplitter

最新更新