在 PyQt 中正确定位弹出窗口小部件

Cry*_*ite 5 python pyqt css-position popup

这个问题困扰了我很多年,主要是因为移动小部件之类的方法有很多种组合。本质上,我有一个简单的小部件,我希望能够在我的应用程序的特定区域中弹出它。问题是我似乎永远无法让它出现在我想要的地方。此外,我想以一种可以根据它是否弹出以指向应用程序左上角的小部件而不是底部的小部件来调整它的“指针”侧的方式进行设置 -正确的。

理想情况下,我能够将弹出窗口放置在靠近父窗口小部件边缘的位置,并根据它所在的位置对其进行锚定。这就是我一直在尝试的。

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

class popup(QWidget):
    def __init__(self, parent = None, widget=None):    
        QWidget.__init__(self, parent)
        layout = QGridLayout(self)
        button = QPushButton("Very Interesting Text Popup. Here's an arrow   ^")
        layout.addWidget(button)
        self.move(widget.rect().bottomLeft())

class Window(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.button = QPushButton('Hit this button to show a popup', self)
        self.button.clicked.connect(self.handleOpenDialog)
        self.button.move(250, 50)
        self.resize(600, 200)

    def handleOpenDialog(self):
        self.popup = popup(self, self.button)
        self.popup.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

此代码生成一个随机位于小部件中间的按钮。在这个例子中,我想要得到的是,弹出窗口显示在按钮下方,其“枢轴”位于右上角,这样弹出按钮中的箭头将指向小部件的右下角。然而,它却弹出在窗口的左上角。在我对 .move、.setGeometry 和 QRect 的所有搞乱中,我一生都无法弄清楚这一点。向任何能够伸出援手的人致以巨大的荣誉。谢谢!

Eri*_*ser 1

在这里 - 注释有点解释了它背后的逻辑 - 因为问题是一个示例和关于定位的问题,所以除了弹出类之外,我将其余代码保持不变,但只是提一下,因为它是一个令人讨厌的地方 - 你不应该导入 * (永远),但尤其是像 PyQt4.QtCore/QtGui 这样大的东西......

    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    import sys

    class popup(QWidget):
        def __init__(self, parent = None, widget=None):    
            QWidget.__init__(self, parent)
            layout = QGridLayout(self)
            button = QPushButton("Very Interesting Text Popup. Here's an arrow   ^")
            layout.addWidget(button)

            # adjust the margins or you will get an invisible, unintended border
            layout.setContentsMargins(0, 0, 0, 0)

            # need to set the layout
            self.setLayout(layout)
            self.adjustSize()

            # tag this widget as a popup
            self.setWindowFlags(Qt.Popup)

            # calculate the botoom right point from the parents rectangle
            point        = widget.rect().bottomRight()

            # map that point as a global position
            global_point = widget.mapToGlobal(point)

            # by default, a widget will be placed from its top-left corner, so
            # we need to move it to the left based on the widgets width
            self.move(global_point - QPoint(self.width(), 0))

    class Window(QWidget):
        def __init__(self):
            QWidget.__init__(self)
            self.button = QPushButton('Hit this button to show a popup', self)
            self.button.clicked.connect(self.handleOpenDialog)
            self.button.move(250, 50)
            self.resize(600, 200)

        def handleOpenDialog(self):
            self.popup = popup(self, self.button)
            self.popup.show()

    if __name__ == '__main__':
        app = QApplication(sys.argv)
        win = Window()
        win.show()
        sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)