PyQt5中的对齐弹出窗口小部件

问题描述 投票:0回答:1

我已经看到许多关于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的。在将弹出窗口小部件与按钮的右侧对齐方面会有些指针。 ...

python python-3.x pyqt pyqt5
1个回答
0
投票

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_())
© www.soinside.com 2019 - 2024. All rights reserved.