如何在 PyQt5 中相对于父窗口移动子窗口?

Posted

技术标签:

【中文标题】如何在 PyQt5 中相对于父窗口移动子窗口?【英文标题】:How to move a child window relative to a parent window in PyQt5? 【发布时间】:2021-03-22 11:24:15 【问题描述】:

我有以下代码,但我希望新窗口不完全设置在主窗口的中心。我更愿意将它向左移动一点(例如向左移动 20 像素,向上移动 20 像素),我尝试过 moveTo() 和 moveLeft(),但无法真正弄清楚。我可以使用 topLeft() 进行管理,但它与主窗口无关。下面的代码用于居中。问题是如何更改我的代码以获得上述结果?

class Form(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.ui = Ui_suffix_editor_panel()
        self.ui.setupUi(self)

        self.suffix_list = Suffix_window(parent=self)
        
        self.ui.show.clicked.connect(self.show_all_suffix_list)
        
        self.show()


    def show_all_suffix_list(self):
        
        self.suffix_list.ui.all_suffix_list.clear()
        open_known_list = open("known.txt", "r")
        for known in open_known_list.read().split('\n'):
            self.suffix_list.ui.all_suffix_list.insertItem(0, known)
            self.suffix_list.show()



class Suffix_window(QWidget):
    def __init__(self, parent=None):
        self.parent = parent
        QWidget.__init__(self)
        self.ui = Ui_suffix_widget()
        self.ui.setupUi(self)


        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
        self.ui.exit_list_view.clicked.connect(lambda: self.close())

    def showEvent(self, event):
        if not event.spontaneous():
            geo = self.geometry()
            geo.moveLeft(self.parent.geometry().left())
            QtCore.QTimer.singleShot(0, lambda: self.setGeometry(geo))

它看起来像这样:

期望的结果:

【问题讨论】:

请提供minimal reproducible example 更新了代码。 @eyllanesc 它相对于Form 窗口居中,我真正想要的是将其向左定位 10-20 像素。 我不明白你的问题。在您的代码中,您已经在更改几何图形,结果接近您所要求的结果。只需正确使用 QRect 函数(注意setLeft 会改变宽度,您可能想使用moveLeft)。 如果我使用 moveLeft,则需要一个参数,并且与 Form 窗口无关。所以它会在另一个屏幕的左侧打开。 【参考方案1】:

解决这个问题的一种方法是首先将子矩形相对于父矩形居中,然后通过相对偏移量平移结果:

class Form(QMainWindow):
    ...    

    def show_all_suffix_list(self):            
        self.suffix_list.ui.all_suffix_list.clear()
        open_known_list = open("known.txt", "r")
        for known in open_known_list.read().split('\n'):
            self.suffix_list.ui.all_suffix_list.insertItem(0, known)

        # set initial size
        rect = QtCore.QRect(0, 0, 300, 300)
        # centre on parent
        rect.moveCenter(self.geometry().center())
        # adjust by relative offset (negative values go left/up)
        rect.translate(QtCore.QPoint(-50, 0))

        self.suffix_list.setGeometry(rect)
        self.suffix_list.show()
    

【讨论】:

谢谢!这就是我要找的东西!

以上是关于如何在 PyQt5 中相对于父窗口移动子窗口?的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5编程(9):窗口在屏幕的位置与管理

相对于父级放置窗口

具有多个意图的 PyQt5(同一窗口中的页面)

怎样获取一个控件相对于父窗口的坐标位置

让一个元素相对于父元素固定定位

查找相对于父滚动 div 而不是窗口的偏移量