Как получить положение экрана `QMainWindow` и распечатать его? - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь получить позицию экрана QMainWindow и print значения позиции (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, как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Я добавлю ссылку 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_())

enter image description here

0 голосов
/ 10 ноября 2018

Позиция виджета относительно родителя, если он у него есть, а если у него его нет, то относительно экрана, так что в случае MainWindow, поскольку это окно, pos() следует использовать, если это был виджет, у которого есть родитель, вы должны использовать 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_())
...