【问题标题】:Aligning popup widget in PyQt5在 PyQt5 中对齐弹出窗口小部件
【发布时间】:2019-12-05 18:57:45
【问题描述】:

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

结果如下:

【问题讨论】:

    标签: python python-3.x pyqt pyqt5


    【解决方案1】:

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

    【讨论】:

    • 这正是我想要的!不过我有一个问题,'super().showEvent(event)' 有什么作用?
    • @SureshKumar showEvent 方法在小部件显示时被 Qt 调用。你必须阅读 Qt 的文档。
    • 我一直在阅读文档,但显然没有掌握内容哈哈。我询问代码上的 super() 语句的原因是因为您提供的解决方案可以在有或没有该行的情况下工作,所以只是想知道,但仍然感谢您提供的指针。
    猜你喜欢
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 2020-07-01
    相关资源
    最近更新 更多