1. 程式人生 > >PyQt5基本視窗控制元件二(QWidget)

PyQt5基本視窗控制元件二(QWidget)

QWidget基本介紹

基礎視窗控制元件QWidget類是所有使用者介面物件的基類,所有的視窗或者控制元件都直接或者間接的繼承自QWidget類。

視窗座標系統

PyQt使用統一的座標系統來定位視窗控制元件的位置和大小,具體如下
視窗座標系統
以螢幕左上角為原點,也就是(0, 0)點,從左向右為x軸正方向,從上向下為y軸正方向,整個螢幕的座標系統用來定位頂層視窗。
在視窗內部也有自己的座標系統,該座標系統以客戶區的左上角為原點,從左向右為x軸正方向,從上到下為y軸正方向,在客戶區周圍有標題欄和邊框。
QWidget幾何機構
從上圖中,可以將這些成員函式分成三類:

  1. QWidget直接提供的成員函式,x(), y()獲得整個視窗左上角的座標,width()和height()返回客戶區的寬度和高度。
  2. QWidget的geometry()提供的成員函式,x(),y()返回的是客戶區左上角座標,width(),height()返回客戶區寬度和高度。
  3. QWidget的frameGeometry()提供的成員函式,x(),y()返回的是整個視窗左上角的座標,-width(),height()也是整個對話方塊的寬度和高度,包括標題欄和邊框。

從上圖可以看出來,QWidget有兩種常見的幾何結構
不包含外面各種邊框的幾何結構(客戶區)。
包含各種邊框的幾何結構。

不包含邊框常用函式

  • 改變客戶區面積
    QWidget.resize(width, height)
  • 獲取客戶區大小
    QWidget.size()
  • 獲取客戶區的寬度和高度
    QWidget.width()
    QWidget.height()
  • 設定客戶區的寬度和高度(在某些維度上值不可改變)
    QWidget.setFixedWidth(int width)
    QWidget.setFixedHeight(int height)
    QWidget.setFixedSize(int width, int height)
  • 設定視窗的位置(值可以改變)
    QWidget.setGeometry(int x, int y, int width, int height)

包含邊框常用函式

  • 獲取視窗的大小和位置
    QWidget.frameGeometry()
  • 設定視窗的位置
    QWidget.move(int x, int y)
  • 獲取視窗左上角座標
    QWidget.pos()

座標系統測試

# _*_ coding:utf-8 _*_
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton)

class MyDialog(QWidget):
    def __init__(self):
        super(MyDialog, self).__init__()
        self.init_ui()

    def init_ui(self):
        # (50, 50)相對螢幕最左上角
        # (300, 200)客戶區寬度 高度
        self.move(50, 50)
        self.resize(300, 200)
        self.setWindowTitle('測試視窗座標系統')

        self.btn = QPushButton('測試按鈕', self)
        # 相對於客戶區的原點
        self.btn.move(20, 20)

        self.show()

    def show_coordinate(self):
        print("顯示整個視窗的引數")
        print("QWidget.x() = %d" % self.x())
        print("QWidget.y() = %d" % self.y())
        print("QWidget.pos()" + str(self.pos()))
        print("width=%d" % self.frameGeometry().width())
        print("height=%d\n" % self.frameGeometry().height())

        print("顯示工作區引數")
        print("x=%d" % self.geometry().x())
        print("y=%d" % self.geometry().y())
        print("width=%d" % self.width())
        print("height=%d" % self.height())
        print("geometry width=%d" % self.geometry().width())
        print("geometry height=%d\n" % self.geometry().height())

        print("顯示按鈕引數")
        print("x=%d" % self.btn.x())
        print("y=%d" % self.btn.y())

if __name__ == "__main__":

    app = QApplication(sys.argv[1:])

    win = MyDialog()
    win.show_coordinate()

    sys.exit(app.exec_())

顯示整個視窗的引數 QWidget.x() = 50 QWidget.y() = 50
QWidget.pos()PyQt5.QtCore.QPoint(50, 50) width=318 height=245

顯示工作區引數 x=59 y=86 width=300 height=200 geometry width=300 geometry
height=200

顯示按鈕引數 x=20 y=20

座標系測試