繁体   English   中英

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

[英]Aligning popup widget in PyQt5

我已经看到很多关于这个问题的回复,但不是专门针对 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_())

结果如下所示:

弹出图像

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM