我已经看到许多关于SO的回复,但不是专门针对QMenu和QToolButton的。在将弹出窗口小部件与按钮的右侧对齐方面会有些指针。这是我正在研究的基本代码。
import sys from PyQt5.QtWidgets import * class test(QWidget): def __init__(self): super().__init__() self.resize(200, 100) layout = QHBoxLayout(self) label = QLabel('Testing QToolButton Popup') toolbutton = QToolButton() toolbutton.setPopupMode(QToolButton.InstantPopup) widget = QWidget() widgetLayout = QHBoxLayout(widget) widgetLabel = QLabel('Popup Text') widgetSpinbox = QSpinBox() widgetLayout.addWidget(widgetLabel) widgetLayout.addWidget(widgetSpinbox) widgetAction = QWidgetAction(toolbutton) widgetAction.setDefaultWidget(widget) widgetMenu = QMenu(toolbutton) widgetMenu.addAction(widgetAction) toolbutton.setMenu(widgetMenu) layout.addWidget(label) layout.addWidget(toolbutton) if __name__ == '__main__': app = QApplication(sys.argv) win = test() win.show() sys.exit(app.exec_())
结果看起来像这样:
“ >>
我已经看到许多关于SO的回复,但不是专门针对QMenu和QToolButton的。在将弹出窗口小部件与按钮的右侧对齐方面会有些指针。 ...
Qt开发人员认为默认位置是正确的,因此,如果要修改对齐方式,必须如下图所示移动QMenu:
import sys
from PyQt5.QtCore import QPoint
from PyQt5.QtWidgets import (
QApplication,
QHBoxLayout,
QLabel,
QMenu,
QSpinBox,
QToolButton,
QWidgetAction,
QWidget,
)
class Menu(QMenu):
def showEvent(self, event):
if self.isVisible():
button = self.parentWidget()
if button is not None:
pos = button.mapToGlobal(button.rect().bottomRight())
self.move(pos - self.rect().topRight())
super().showEvent(event)
class Test(QWidget):
def __init__(self):
super().__init__()
self.resize(200, 100)
layout = QHBoxLayout(self)
label = QLabel("Testing QToolButton Popup")
toolbutton = QToolButton(popupMode=QToolButton.InstantPopup)
widgetLabel = QLabel("Popup Text")
widgetSpinbox = QSpinBox()
widget = QWidget()
widgetLayout = QHBoxLayout(widget)
widgetLayout.addWidget(widgetLabel)
widgetLayout.addWidget(widgetSpinbox)
widgetAction = QWidgetAction(toolbutton)
widgetAction.setDefaultWidget(widget)
widgetMenu = Menu(toolbutton)
widgetMenu.addAction(widgetAction)
toolbutton.setMenu(widgetMenu)
layout.addWidget(label)
layout.addWidget(toolbutton)
if __name__ == "__main__":
app = QApplication(sys.argv)
win = Test()
win.show()
sys.exit(app.exec_())