1. 程式人生 > >《快速掌握PyQt5》第十六章 視窗座標

《快速掌握PyQt5》第十六章 視窗座標

第十六章 視窗座標

這一章我們來了解一下PyQt5中的座標體系。

16.1 理解座標體系

請記住一點:不管從顯示屏螢幕還是視窗部件來看,左上角都為原點(0, 0),向右為x軸正向,向下為y軸正向。

接著我們來看一下Qt官方文件上關於視窗座標的一張圖:

我們可以把視窗分成三塊:標題欄、邊框和客戶區,這樣進行分割後我們才能很好地理解不同的方法所獲取到的座標有什麼不同。

以上方法理解如下:

  • x()——得到視窗左上角在顯示屏螢幕上的x座標;
  • y()——得到視窗左上角在顯示屏螢幕上的y座標;
  • pos()——得到視窗左上角在顯示屏螢幕上的x和y座標;
  • geometry().x()——的到客戶區左上角在顯示屏螢幕上的x座標;
  • geometry().y()——的到客戶區左上角在顯示屏螢幕上的y座標;
  • geometry()——的到客戶區左上角在顯示屏螢幕上的x和y座標;
  • width()——得到客戶區的寬度;
  • height()——得到客戶區的長度;
  • geometry().width()——得到客戶區的寬度;
  • geometry().height()——得到客戶區的長度;
  • frameGeometry().width()——得到視窗的寬度;
  • frameGeometry().height()——得到視窗的長度;

補充:

  • frameGeometry().x()——即x(),得到視窗左上角在顯示屏螢幕上的x座標;
  • frameGeometry().y()——即y(),得到視窗左上角在顯示屏螢幕上的y座標;
  • frameGeometry()——即pos(),得到視窗左上角在顯示屏螢幕上的x和y座標;

注:通過geometry()和frameGeometry()獲取座標的相關方法需要在視窗呼叫show()方法之後才能使用,否則獲取的將是無用資料。

現在我們來例項化一個QWidget視窗,並呼叫各個方法列印下它的座標:

import sys
from PyQt5.QtWidgets import QApplication, QWidget


if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = QWidget()
    widget.resize(200, 200)                    # 1
    widget.move(100, 100)                      # 2
    # widget.setGeometry(100, 100, 200, 200)   # 3
    widget.show()

    print('-----------------x(), y(), pos()-----------------')
    print(widget.x())
    print(widget.y())
    print(widget.pos())

    print('-----------------width(), height()-----------------')
    print(widget.width())
    print(widget.height())

    print('-----------------geometry().x(), geometry.y(), geometry()-----------------')
    print(widget.geometry().x())
    print(widget.geometry().y())
    print(widget.geometry())

    print('-----------------geometry.width(), geometry().height()-----------------')
    print(widget.geometry().width())
    print(widget.geometry().height())

    print('-----------------frameGeometry().x(), frameGeometry().y(), frameGeometry(), '
          'frameGeometry().width(), frameGeometry().height()-----------------')
    print(widget.frameGeometry().x())
    print(widget.frameGeometry().y())
    print(widget.frameGeometry())
    print(widget.frameGeometry().width())
    print(widget.frameGeometry().height())

    sys.exit(app.exec_())

1. 通過resize(200, 200)方法來設定視窗大小;

2. 通過move(100, 100)方法將視窗移到螢幕座標為(100, 100)的位置來;

3. 以上兩個方法可以單單通過setGeometry(x, y, width, height)方法來完成。

以下是在MacOS系統上的輸出結果:

-----------------x(), y(), pos()-----------------
100
100
PyQt5.QtCore.QPoint(100, 100)
-----------------width(), height()-----------------
200
200
-----------------geometry().x(), geometry.y(), geometry()-----------------
100
122
PyQt5.QtCore.QRect(100, 122, 200, 200)
-----------------geometry.width(), geometry().height()-----------------
200
200
-----------------frameGeometry().x(), frameGeometry().y(), frameGeometry(), frameGeometry().width(), frameGeometry().height()-----------------
100
100
PyQt5.QtCore.QRect(100, 100, 200, 222)
200
222

以下是在Windows系統上(win7)的輸出結果:

-----------------x(), y(), pos()-----------------
100
100
PyQt5.QtCore.QPoint(100, 100)
-----------------width(), height()-----------------
200
200
-----------------geometry().x(), geometry.y(), geometry()-----------------
108
130
PyQt5.QtCore.QRect(108, 130, 200, 200)
-----------------geometry.width(), geometry().height()-----------------
200
200
-----------------frameGeometry().x(), frameGeometry().y(), frameGeometry(), frameGeometry().width(), frameGeometry().height()-----------------
100
100
PyQt5.QtCore.QRect(100, 100, 216, 238)
216
238

以下是在Linux(Ubuntu)上的輸出結果:

-----------------x(), y(), pos()-----------------
100
100
PyQt5.QtCore.QPoint(100, 100)
-----------------width(), height()-----------------
200
200
-----------------geometry().x(), geometry.y(), geometry()-----------------
100
100
PyQt5.QtCore.QRect(100, 100, 200, 200)
-----------------geometry.width(), geometry().height()-----------------
200
200
-----------------frameGeometry().x(), frameGeometry().y(), frameGeometry(), frameGeometry().width(), frameGeometry().height()-----------------
100
100
PyQt5.QtCore.QRect(100, 100, 200, 200)
200
200

我們發現由於顯示的視窗樣式不同,個別座標或者大小顯示的數值也不相同。

Mac上的視窗樣式:

Windows(Win7)上的視窗樣式:

Linux(Ubuntu)上的視窗樣式:

16.2 小結 

1. 視窗可分為標題欄、邊框和客戶區三個部分。但是從Linux系統上的輸出結果來看,在Linux上的視窗並沒有將視窗劃分為是那個部分,而是始終保持一個整體。Mac上的視窗也沒有邊框這一部分;

2. move(x, y)和resize(width, height)方法的功能可以單單通過setGeometry(x, y, width, height)方法來實現(我們也可以用該方法實現視窗中各控制元件的佈局)。

----------------------------------------------------------------------

喜歡的小夥伴可以加入這個Python QQ交流群一起學習:820934083