如何在 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 中相对于父窗口移动子窗口?的主要内容,如果未能解决你的问题,请参考以下文章