【问题标题】:How to get the screen position of `QMainWindow` and print it?如何获取 `QMainWindow` 的屏幕位置并打印?
【发布时间】:2019-04-13 12:47:24
【问题描述】:

我正在尝试获取QMainWindowprint 的位置(x,y)值的屏幕位置。 self.pos()self.mapToGlobal(self.pos()) 我都试过了,这两个都返回 0

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow


class MainWindow(QMainWindow):

    def __init__(self):
        QMainWindow.__init__(self)
        self.resize(400, 200)

        # PRINTS 0 0
        print(self.pos().x(), self.pos().y())

        # PRINTS 0 0
        print(self.mapToGlobal(self.pos()).x(), self.mapToGlobal(self.pos()).y())


app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

我正在使用 Python 3.7 和 PyQt 5.11,我该如何实现?

【问题讨论】:

    标签: python pyqt position coordinates qmainwindow


    【解决方案1】:

    我将添加链接http://doc.qt.io/qt-5/application-windows.html#window-geometry 和一个示例:

    import sys
    from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, 
                                 QVBoxLayout, QTextEdit, QPushButton)
    
    
    class MainWindow(QMainWindow):
    
        def __init__(self):
            QMainWindow.__init__(self)
            self.resize(400, 200)
    
    
            centralWidget = QWidget()
            self.setCentralWidget(centralWidget)
    
            self.textEdit = QTextEdit()
            self.btn = QPushButton("get the screen position of `QMainWindow`")
            self.btn.clicked.connect(self.btnClicked)
    
            layoutV = QVBoxLayout(centralWidget)
            layoutV.addWidget(self.textEdit)
            layoutV.addWidget(self.btn)
    
            self.textEdit.append("Start:")
            self.textEdit.append("pos.x=`{}`, pos.y=`{}`"
                                 "".format(self.pos().x(), self.pos().y()))
            self.textEdit.append("geometry.x=`{}`, geometry.y=`{}`"
                                 "".format(self.geometry().x(), self.geometry().y()))
            self.textEdit.append("--------------------------------------")
    
        def btnClicked(self):
            self.textEdit.append("pos.x=`{}`, pos.y=`{}`"
                                 "".format(self.pos().x(), self.pos().y()))
            self.textEdit.append("geometry.x=`{}`, geometry.y=`{}`"
                                 "".format(self.geometry().x(), self.geometry().y()))
    
    
    
        def moveEvent(self, event):    # QMoveEvent      
            print("x=`{}`, y=`{}`".format(event.pos().x(), event.pos().y()))
            super(MainWindow, self).moveEvent(event)
    
        def resizeEvent(self, event):  # QResizeEvent      
            print("w=`{}`, h=`{}`".format(event.size().width(), event.size().height())) 
            super(MainWindow, self).resizeEvent(event)        
    
    
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
    

    【讨论】:

      【解决方案2】:

      一个小部件的位置是相对于父级的,如果它有它,如果它没有它是相对于屏幕,所以在MainWindow的情况下,因为它是一个窗口,@987654322应该使用@,如果它是一个有父级的小部件,则必须使用self.mapToGlobal(QtCore.QPoint(0, 0)),因为它位于左上角。

      另一方面,每个小部件的初始位置是QPoint(0, 0),如果它是一个窗口,操作系统会操纵它的位置并移动它,所以你得到(0, 0)的值,所以在你的情况下你必须跟踪位置的变化,例如使用moveEvent:

      import sys
      from PyQt5 import QtCore, QtWidgets
      
      class MainWindow(QtWidgets.QMainWindow):
          def __init__(self):
              super(MainWindow, self).__init__()
              self.resize(400, 200)
      
          def moveEvent(self, e):
              print(self.pos())
              super(MainWindow, self).moveEvent(e)
      
      if __name__ == '__main__':
          app = QtWidgets.QApplication(sys.argv)
          window = MainWindow()
          window.show()
          sys.exit(app.exec_())
      

      【讨论】:

      • 花了几个小时研究这个问题,但还是想不通。感谢您的清晰解释。
      • @eyllanesc 返回函数 moveEvent 有问题吗?在我的情况下,当我添加一个“返回 True”时,会出现一个错误,即“TypeError:MyClass.moveEvent() 的无效结果”
      猜你喜欢
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 2013-06-10
      • 2013-10-03
      • 2016-10-05
      相关资源
      最近更新 更多