PyQt - QGraphicsAnchorLayout



在 GUI 構建中,錨佈局是一種佈局管理器,允許使用者相對於容器邊緣來定位和調整控制元件的大小。當我們想要保持控制元件的位置而不受視窗整體大小的影響時,它非常有用。控制元件可以錨定到容器的頂部、左側、右側、底部和中心。

在 PyQt 中,類 QGraphicsAnchorLayout 提供了一個佈局,可以在圖形檢視中將控制元件相互錨定。

錨佈局使開發人員能夠指定控制元件相對於佈局和其他控制元件的定位。使用 addAnchor()、addAnchors() 或 addCornerAnchors() 向佈局新增錨點。

使用 anchor() 函式訪問佈局中已存在的錨點。錨定的專案將根據需要自動新增到佈局中和從佈局中移除。

錨點總是建立在物件的邊緣之間,包括“中心”作為邊緣。

以下是一個示例:

layout.addAnchor(b, Qt.AnchorLeft, a, Qt.AnchorRight)
layout.addAnchor(b, Qt.AnchorTop, a, Qt.AnchorBottom)

在上圖中,專案 a 的右邊緣連線到專案 b 的左邊緣,而專案 a 的下邊緣連線到專案 b 的上邊緣。這導致專案 b 對角線位於專案 a 的右下方。

錨點用於匹配控制元件的寬度或高度。因此,使用 addAnchor() 函式非常方便。

示例

以下示例演示了 QGraphicsAnchorLayout 的程式碼片段,用於構建容器或框組。

import sys
from PyQt5.QtCore import QSizeF, Qt
from PyQt5.QtWidgets import (QApplication, QGraphicsAnchorLayout,
QGraphicsProxyWidget, QGraphicsScene, QGraphicsView, QGraphicsWidget,
QPushButton, QSizePolicy)
def createItem(minimum, preferred, maximum, name):
   wid = QGraphicsProxyWidget()

   wid.setWidget(QPushButton(name))
   wid.setMinimumSize(minimum)
   wid.setPreferredSize(preferred)
   wid.setMaximumSize(maximum)
   wid.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)

   return wid
if __name__ == '__main__':

   app = QApplication(sys.argv)

   scene = QGraphicsScene()
   scene.setSceneRect(0, 0, 800, 480)

   minSize = QSizeF(30, 100)
   prefSize = QSizeF(210, 100)
   maxSize = QSizeF(300, 100)

   a = createItem(minSize, prefSize, maxSize, "BOX 1")
   b = createItem(minSize, prefSize, maxSize, "BOX 2")
   c = createItem(minSize, prefSize, maxSize, "BOX 3")
   d = createItem(minSize, prefSize, maxSize, "BOX 4")
   e = createItem(minSize, prefSize, maxSize, "BOX 5")
   f = createItem(QSizeF(30, 50), QSizeF(150, 50), maxSize, "BOX 6")
   g = createItem(QSizeF(30, 50), QSizeF(30, 100), maxSize, "BOX 7")

   lay = QGraphicsAnchorLayout()
   lay.setSpacing(0)

   wid2 = QGraphicsWidget(None, Qt.Window)
   wid2.setPos(20, 20)
   wid2.setLayout(lay)

   # Vertical
   lay.addAnchor(a, Qt.AnchorTop, lay, Qt.AnchorTop)
   lay.addAnchor(b, Qt.AnchorTop, lay, Qt.AnchorTop)

   lay.addAnchor(c, Qt.AnchorTop, a, Qt.AnchorBottom)
   lay.addAnchor(c, Qt.AnchorTop, b, Qt.AnchorBottom)
   lay.addAnchor(c, Qt.AnchorBottom, d, Qt.AnchorTop)
   lay.addAnchor(c, Qt.AnchorBottom, e, Qt.AnchorTop)

   lay.addAnchor(d, Qt.AnchorBottom, lay, Qt.AnchorBottom)
   lay.addAnchor(e, Qt.AnchorBottom, lay, Qt.AnchorBottom)

   lay.addAnchor(c, Qt.AnchorTop, f, Qt.AnchorTop)
   lay.addAnchor(c, Qt.AnchorVerticalCenter, f, Qt.AnchorBottom)
   lay.addAnchor(f, Qt.AnchorBottom, g, Qt.AnchorTop)
   lay.addAnchor(c, Qt.AnchorBottom, g, Qt.AnchorBottom)

   # Horizontal
   lay.addAnchor(lay, Qt.AnchorLeft, a, Qt.AnchorLeft)
   lay.addAnchor(lay, Qt.AnchorLeft, d, Qt.AnchorLeft)
   lay.addAnchor(a, Qt.AnchorRight, b, Qt.AnchorLeft)

   lay.addAnchor(a, Qt.AnchorRight, c, Qt.AnchorLeft)
   lay.addAnchor(c, Qt.AnchorRight, e, Qt.AnchorLeft)

   lay.addAnchor(b, Qt.AnchorRight, lay, Qt.AnchorRight)
   lay.addAnchor(e, Qt.AnchorRight, lay, Qt.AnchorRight)
   lay.addAnchor(d, Qt.AnchorRight, e, Qt.AnchorLeft)

   lay.addAnchor(lay, Qt.AnchorLeft, f, Qt.AnchorLeft)
   lay.addAnchor(lay, Qt.AnchorLeft, g, Qt.AnchorLeft)
   lay.addAnchor(f, Qt.AnchorRight, g, Qt.AnchorRight)

   scene.addItem(wid2)
   scene.setBackgroundBrush(Qt.lightGray)

   view = QGraphicsView(scene)
   view.show()
   sys.exit(app.exec_())

輸出

以上程式碼產生以下輸出:

qgraphics Anchor Layout
廣告
© . All rights reserved.