最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PyQt6/PySide6 的 QPropertyAnimation 類適用場景分析

 更新時間:2025年03月17日 09:23:40   作者:燃燈工作室  
QGraphicsView和QGraphicsScene是Qt圖形視圖框架的核心類,用于構(gòu)建高性能、可交互的2D圖形界面,QGraphicsView 和 QGraphicsScene 為復(fù)雜圖形應(yīng)用提供了強大支持,本文給大家介紹PyQt6/PySide6 的 QPropertyAnimation 類,感興趣的朋友一起看看吧

一、概述

QGraphicsViewQGraphicsScene 是 Qt 圖形視圖框架的核心類,用于構(gòu)建高性能、可交互的 2D 圖形界面。
核心分工

  • QGraphicsScene:管理場景中的圖形項(QGraphicsItem),處理事件和坐標(biāo)系統(tǒng)。
  • QGraphicsView:作為觀察場景的視口,提供縮放、平移、旋轉(zhuǎn)等視圖變換功能。

適用場景

  • 復(fù)雜繪圖(如 CAD 工具)
  • 游戲開發(fā)(2D 場景)
  • 數(shù)據(jù)可視化(圖表、流程圖)
  • 交互式圖形界面(可拖拽、編輯的組件)

二、核心組件與關(guān)系

組件層級

QGraphicsView (視圖)
  └── QGraphicsScene (場景)
      └── QGraphicsItem (圖形項:矩形、橢圓、文本、自定義項等)

坐標(biāo)系差異

  • 場景坐標(biāo):場景的全局坐標(biāo)系(原點在場景中心或自定義位置)。
  • 視圖坐標(biāo):視圖窗口的坐標(biāo)系(原點在左上角)。
  • 項坐標(biāo):每個圖形項自身的局部坐標(biāo)系。

三、基礎(chǔ)使用步驟

創(chuàng)建場景與視圖

from PyQt6.QtWidgets import QGraphicsView, QGraphicsScene, QApplication
from PyQt6.QtCore import Qt
scene = QGraphicsScene()  # 創(chuàng)建場景
view = QGraphicsView(scene)  # 創(chuàng)建視圖并綁定場景
view.setRenderHint(QPainter.RenderHint.Antialiasing)  # 抗鋸齒
view.resize(800, 600)
view.show()

添加圖形項到場景

# 添加矩形(位置、大小、顏色)
rect = scene.addRect(0, 0, 100, 50, Qt.GlobalColor.red, Qt.GlobalColor.blue)
# 添加文本
text = scene.addText("Hello Graphics", QFont("Arial", 12))
text.setPos(50, 50)
# 添加橢圓
ellipse = scene.addEllipse(200, 100, 80, 60, Qt.GlobalColor.green)

四、核心功能與實戰(zhàn)案例

交互式圖形項(拖拽、旋轉(zhuǎn))

class MovableRect(QGraphicsRectItem):
    def __init__(self, x, y, w, h):
        super().__init__(x, y, w, h)
        self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsMovable)  # 允許拖拽
        self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsSelectable)  # 允許選中
        self.setBrush(Qt.GlobalColor.cyan)
# 添加可移動矩形到場景
movable_rect = MovableRect(300, 200, 80, 40)
scene.addItem(movable_rect)

視圖操作(縮放與平移)

# 鼠標(biāo)滾輪縮放
def wheelEvent(self, event):
    factor = 1.2 if event.angleDelta().y() > 0 else 0.8
    self.scale(factor, factor)
# 右鍵拖拽平移
view.setDragMode(QGraphicsView.DragMode.ScrollHandDrag)  # 設(shè)置拖拽模式

自定義圖形項(繪制箭頭)

class ArrowItem(QGraphicsItem):
    def boundingRect(self):
        return QRectF(-10, -5, 20, 10)  # 定義項邊界
    def paint(self, painter, option, widget):
        painter.setPen(QPen(Qt.GlobalColor.black, 2))
        painter.drawLine(0, 0, 10, 0)  # 箭頭主體
        painter.drawLine(10, 0, 5, -5)  # 箭頭尖端
        painter.drawLine(10, 0, 5, 5)
arrow = ArrowItem()
arrow.setPos(400, 300)
scene.addItem(arrow)

動畫與圖形項結(jié)合

# 使用 QPropertyAnimation 移動圖形項
from PyQt6.QtCore import QPropertyAnimation
anim = QPropertyAnimation(arrow, b"pos")
anim.setDuration(2000)
anim.setStartValue(QPointF(400, 300))
anim.setEndValue(QPointF(500, 400))
anim.setEasingCurve(QEasingCurve.Type.InOutQuad)
anim.start()

五、高級功能

碰撞檢測

# 檢測矩形與其他項的碰撞
colliding_items = rect.collidingItems()
for item in colliding_items:
    item.setBrush(Qt.GlobalColor.yellow)  # 高亮碰撞項

組合項(QGraphicsItemGroup)

group = QGraphicsItemGroup()
group.addToGroup(rect)
group.addToGroup(text)
group.setRotation(45)  # 整體旋轉(zhuǎn) 45 度
scene.addItem(group)

場景事件處理

class CustomScene(QGraphicsScene):
    def mousePressEvent(self, event):
        if event.button() == Qt.MouseButton.LeftButton:
            print(f"Scene 點擊位置:{event.scenePos()}")
        super().mousePressEvent(event)

六、注意事項

性能優(yōu)化

  • 避免在場景中放置過多項(超過數(shù)千個)。
  • 使用 QGraphicsItem.ItemClipsToShapesetCacheMode 優(yōu)化渲染。

坐標(biāo)轉(zhuǎn)換

使用 mapToScene()mapFromScene() 在視圖、場景、項之間轉(zhuǎn)換坐標(biāo)。

# 將視圖坐標(biāo) (100, 200) 轉(zhuǎn)換為場景坐標(biāo)
scene_pos = view.mapToScene(100, 200)

內(nèi)存管理

刪除圖形項時需調(diào)用 removeItem(),避免內(nèi)存泄漏。

scene.removeItem(rect)
del rect  # 顯式刪除對象

七、綜合案例:簡易繪圖工具

class DrawingScene(QGraphicsScene):
    def __init__(self):
        super().__init__()
        self.current_item = None
    def mousePressEvent(self, event):
        if event.button() == Qt.MouseButton.LeftButton:
            self.current_item = QGraphicsEllipseItem()
            self.current_item.setRect(event.scenePos().x(), 
                                     event.scenePos().y(), 
                                     0, 0)
            self.addItem(self.current_item)
    def mouseMoveEvent(self, event):
        if self.current_item:
            start_pos = event.buttonDownScenePos(Qt.MouseButton.LeftButton)
            current_pos = event.scenePos()
            self.current_item.setRect(
                start_pos.x(), start_pos.y(),
                current_pos.x() - start_pos.x(),
                current_pos.y() - start_pos.y()
            )
    def mouseReleaseEvent(self, event):
        self.current_item = None
# 使用示例
app = QApplication([])
scene = DrawingScene()
view = QGraphicsView(scene)
view.show()
app.exec()

八、總結(jié)

QGraphicsView 和 QGraphicsScene 為復(fù)雜圖形應(yīng)用提供了強大支持,通過組合圖形項、處理事件和優(yōu)化渲染,可實現(xiàn)高度定制化的交互式界面。開發(fā)時需重點關(guān)注坐標(biāo)系統(tǒng)、性能管理和用戶交互邏輯。

到此這篇關(guān)于PyQt6/PySide6 的 QPropertyAnimation 類適用場景分析的文章就介紹到這了,更多相關(guān)PyQt6 QPropertyAnimation 類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

珲春市| 巴里| 永年县| 富民县| 巴林右旗| 永和县| 香港| 白山市| 峨山| 房产| 东阿县| 西城区| 宁远县| 南木林县| 宣汉县| 朝阳县| 西畴县| 榆社县| 山东省| 清新县| 萍乡市| 天峻县| 嘉峪关市| 象山县| 宜兴市| 自治县| 南投县| 固阳县| 丽江市| 五指山市| 温州市| 金乡县| 根河市| 南宫市| 汤原县| 安国市| 大足县| 沂水县| 盱眙县| 潮州市| 卓尼县|