gpt4 book ai didi

python - 在 Qt <= 5.12 中立即清除 `QGraphicsView`

转载 作者:行者123 更新时间:2023-12-01 00:13:02 25 4
gpt4 key购买 nike

下面给出的代码源自another question就这样。它显示一个 QMainWindow,其中有 4 个 QGraphicsView 用于用鼠标在其中进行绘制,以及一个 QPushButton 用于清除 4 个 QGraphicsView .

有一个clear() QPainterPath 类中的方法,但它是在 Qt 5.13 中引入的,而我正在使用 Qt 5.12。所以我编写了自己的方法来清除 View 及其路径。

绘图工作正常,单击Clear按钮不会导致错误,但 View 只会在下次绘图时清除,而不是立即清除。

有什么更好的解决方案可以立即清除 View ?

<小时/>

main.py
import sys

from PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsView, QGraphicsScene, QGraphicsPathItem
from PyQt5.QtGui import QPainterPath, QPen
from PyQt5.QtCore import Qt
from PyQt5.uic import loadUi

# Based on code from https://stackoverflow.com/a/44248794/7481773


class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
loadUi("mainwindow.ui", self)

self.layouts = (self.verticalLayout_top_left, self.verticalLayout_top_right,
self.verticalLayout_bottom_left, self.verticalLayout_bottom_right)

self._views = []

for layout in self.layouts:
graphics_view = GraphicsView()
self._views.append(graphics_view)
layout.addWidget(graphics_view)

self.clear_button.clicked.connect(self.clear_views)

def clear_views(self):
for view in self._views:
view.clear_view()


class GraphicsView(QGraphicsView):
def __init__(self):
super().__init__()
self.start = None
self.end = None

self.setScene(QGraphicsScene())
self.path = QPainterPath()
self.item = GraphicsPathItem()
self.scene().addItem(self.item)

self.contents_rect = self.contentsRect()
self.setSceneRect(0, 0, self.contents_rect.width(), self.contents_rect.height())
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

def clear_view(self):
# self.path.clear() # Qt 5.13
self.path = QPainterPath()
self.scene().update()

def mousePressEvent(self, event):
self.start = self.mapToScene(event.pos())
self.path.moveTo(self.start)

def mouseMoveEvent(self, event):
self.end = self.mapToScene(event.pos())
self.path.lineTo(self.end)
self.start = self.end
self.item.setPath(self.path)


class GraphicsPathItem(QGraphicsPathItem):
def __init__(self):
super().__init__()
pen = QPen()
pen.setColor(Qt.black)
pen.setWidth(5)
self.setPen(pen)


def main():
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
app.exec_()
del main_window, app


if __name__ == "__main__":
main()
<小时/>

主窗口.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>Paint and Clear</string>
</property>
<property name="locale">
<locale language="English" country="UnitedKingdom"/>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout_top_left"/>
</item>
<item row="0" column="1">
<layout class="QVBoxLayout" name="verticalLayout_top_right"/>
</item>
<item row="2" column="0">
<layout class="QVBoxLayout" name="verticalLayout_bottom_left"/>
</item>
<item row="2" column="1">
<layout class="QVBoxLayout" name="verticalLayout_bottom_right"/>
</item>
<item row="1" column="0" colspan="2">
<widget class="QPushButton" name="clear_button">
<property name="text">
<string>Clear</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>24</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>

最佳答案

即使使用 clear() 方法并不意味着 View 已清理,但您必须在项目中设置路径。说到这个问题,一个等价的方法是建立一个新的QPainterPath,此外不需要调用场景的update()方法。使用 clear() 或设置一个空的 QPainterPath 从 Python 端来说是等效的,但从 C++ 端来说,它会导致重复使用优化应用程序的相同内存。

def clear_view(self):
self.path = QPainterPath()
self.item.setPath(self.path)

如果您希望两个版本都兼容,可以使用 try- except:

def clear_view(self):
try:
self.path.clear()
except AttributeError as e:
self.path = QPainterPath()
self.item.setPath(self.path)

关于python - 在 Qt <= 5.12 中立即清除 `QGraphicsView`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59494605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com