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

     2023-03-30     198

关键词:

【中文标题】如何在 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()
    

【讨论】:

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

js如何判断元素相对于父窗口的绝对位置?

A.htm页面:<script>functiontt(obj)//该如何写这里,才能得到该元素相对于父窗口的位置?</script><iframesrc="B.htm"></iframe><divonclick="top.tt(this)">得到相对父窗口的位置</div>B.htm内容:<divonclick=&quo... 查看详情

如何在子窗口中移动父窗口?

】如何在子窗口中移动父窗口?【英文标题】:HowtomovetheparentwindowinChildwindow?【发布时间】:2010-12-0412:39:29【问题描述】:目前,我使用:::SendMessage(GetParent(),WM_NCLBUTTONDOWN,HTCAPTION,0);将父窗口置于移动和调整模式,但这有一些副... 查看详情

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

】查找相对于父滚动div而不是窗口的偏移量【英文标题】:Findoffsetrelativetoparentscrollingdivinsteadofwindow【发布时间】:2015-06-1800:45:20【问题描述】:我在窗口中有一个滚动元素。假设一个具有自动溢出类“currentContainer”的分区,并... 查看详情

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

...法是这样的:crectrect;getwindowrect(&rect);这样获得的是控件相对于屏幕的坐标,然后用screentoclient(&rect)就可以获得控件相对于父窗口的坐标注意:如果你用getclientrect(&rect)的话,rect.left和rect.top始终是0,得到的并不是实际坐标。 查看详情

如何在父窗口中运行子窗口

请教高手关于制作网页的问题^如何在父窗口中运行子窗口,最好还可以让子窗口在父窗口中随鼠标拖动自由移动~~~谢谢参考技术AMDI 查看详情

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

...试开发一个带有主菜单和子菜单的应用程序,但我不知道如何开始。我发现的所有示例都使用该弹出窗口作为子菜单。这是我将要做的一个例子。请对如何开始以及在PyQt5中使用什么有任何建议?主菜单在右边, 查看详情

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

之前在项目中,遇到了一个场景,需要实现相对于父元素的fixed定位:在父元素内拖动滚动条时,"fixed"定位的元素不能滑动,在外层拖动滚动条时,父元素及父元素内的所有元素跟着一起滑动。但是position:fixed是相对于窗口进行... 查看详情

PyQt5拖动框架时移动窗口

...动屏幕。到目前为止,我只得到了顶部的框架,并研究了如何实现这一结果,我查看了诸如thison 查看详情

如何在pyqt5中显示隐藏窗口?

】如何在pyqt5中显示隐藏窗口?【英文标题】:howtoshowahiddenwindowinpyqt5?【发布时间】:2021-12-1615:42:04【问题描述】:我有两个代码:untitled.pyvprs.py当我切换到新窗口(vprs.py)时,第一个窗口被隐藏(untitled.py)。在窗口vprs.py我有... 查看详情

Qt Designer PyQt5 覆盖 CloseEvent 子窗口不起作用

】QtDesignerPyQt5覆盖CloseEvent子窗口不起作用【英文标题】:QtDesignerPyQt5overwriteCloseEventchildwindowdon\'twork【发布时间】:2017-05-1716:58:19【问题描述】:我在QtDesigner中设计了三个窗口。主窗口使用按钮调用两个子窗口。如果我关闭主窗... 查看详情

如何在pyqt5中获得无框窗口?

】如何在pyqt5中获得无框窗口?【英文标题】:Howgetaframelesswindowinpyqt5?【发布时间】:2021-05-0217:55:03【问题描述】:我是PyQt5的新手,我很难弄清楚如何相应地转换代码以使其无框架。我使用了标志,但它一直给我一个错误,即... 查看详情

PyQt5如何在一个窗口中显示不同的页面?

】PyQt5如何在一个窗口中显示不同的页面?【英文标题】:HowcanIshowdifferentpagesinonewindowbyPyQt5?【发布时间】:2017-10-0216:25:21【问题描述】:如您所见,我创建了一个带有左按钮的窗口,但我不知道如何使用QStackedWidget在按下每个按... 查看详情

如何使用opencv在pyqt5中同时在不同窗口中运行一个网络摄像头

】如何使用opencv在pyqt5中同时在不同窗口中运行一个网络摄像头【英文标题】:howtorunonewebcamindifferentwindowsimultaneouslyinpyqt5usingopencv【发布时间】:2020-06-2211:38:37【问题描述】:我想在2个窗口中并行运行我的笔记本电脑网络摄像头... 查看详情

qt判断鼠标在控件上(代码片段)

...某子窗口控件上方需要注意的是,子窗口获取geometry,是相对于父窗口的相对位置,QCursor::pos()获取的是鼠标绝对位置,要不将父窗口的相对位置进行换算,要不将鼠标的绝对位置进行换算,这里本文采用将鼠标绝对位置换算到... 查看详情

如何在主窗口中更改 PyQt5 目录视图的大小?

】如何在主窗口中更改PyQt5目录视图的大小?【英文标题】:HowtochangethesizeofPyQt5directoryviewinthemainwindow?【发布时间】:2018-11-0820:03:39【问题描述】:我正在开发一个PyQt5项目,该项目需要PyQt5QTreeView的文件夹查看器。为了放更多的... 查看详情

如何在这个 pyqt5 窗口中使用 while 循环

】如何在这个pyqt5窗口中使用while循环【英文标题】:Howtousewhileloopinthispyqt5window【发布时间】:2020-01-3108:01:22【问题描述】:这是我在这里的第一个问题。我已经研究了一些类似的问题,但它并没有真正帮助我处理我自己的代码... 查看详情

PyQt5从子窗口关闭父窗口和子窗口

】PyQt5从子窗口关闭父窗口和子窗口【英文标题】:PyQt5closeParentwindow&childwindowfromchildwindow【发布时间】:2020-08-1115:14:25【问题描述】:我已经使用设计器制作了一个pyqt5GUI并转换为python代码。我希望第一个窗口打开另一个窗口... 查看详情

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

...置可使用以下函数:move(intx,inty)move(QPointp)窗口的位置是相对于父窗口的,已包括标题栏的高度和边框的宽度。setGeometry(intx,inty,intw,inth)setGeometry(QRectr)setGeometry()可同时设置窗口的位置和尺寸,与move()不同,x,y的值不包括题栏的高... 查看详情