代码之家  ›  专栏  ›  技术社区  ›  Vlad

如何在场景中隐藏特定项目?

  •  2
  • Vlad  · 技术社区  · 6 年前

    我的问题是,我想“隐藏/显示”,“改变颜色”的一些项目取决于缩放水平在我的用户界面,但我完全迷失在所有的C+论坛,因为我的C+知识接近0。下面是一些代码:

    from PySide2 import QtGui, QtCore, QtWidgets
    from PySide2.QtCore import Signal
    
    class testUi(QtWidgets.QDialog):
        def __init__(self, parent=None):
            super(testUi, self).__init__(parent)
            self.window = 'vl_test'
            self.title = 'Test Remastered'
            self.size = (1000, 650)
    
            self.create( )
    
        def create(self):
            self.setWindowTitle(self.title)
            self.resize(QtCore.QSize(*self.size))
            self.testik = test(self)
    
            self.mainLayout = QtWidgets.QVBoxLayout( )
            self.mainLayout.addWidget(self.testik)
            self.setLayout(self.mainLayout)
    
    
    class test(QtWidgets.QGraphicsView):
        zoom_signal = Signal(bool)
        def __init__(self, parent=None):
            super(test, self).__init__(parent)
            self._scene = QtWidgets.QGraphicsScene()
            self.__zoom = 0
            self.setScene(self._scene)
            self.drawSomething( )
            self.setTransformationAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse)
            self.setResizeAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse)
            self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
            self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
            self.setBackgroundBrush(QtGui.QBrush(QtGui.QColor(30, 30, 30)))
            self.setFrameShape(QtWidgets.QFrame.NoFrame)
            self.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding))
    
        def drawSomething(self):
            path = QtGui.QPainterPath( )
            path.moveTo(0, 0)
            path.addRect(20, 20, 60, 60)
            item = self._scene.addPath(path)
            item.setPen(QtGui.QPen(QtGui.QColor(79, 106, 25), 1, QtCore.Qt.SolidLine, QtCore.Qt.FlatCap, QtCore.Qt.MiterJoin))
            item.setBrush(QtGui.QColor(122, 163, 39))
    
    
        def wheelEvent(self, event):
            if event.angleDelta().y() > 0:
                factor = 1.25
                self.__zoom += 1
            else:
                factor = 0.8
            if self.__zoom > 0:
                self.scale(factor, factor)
            if self.__zoom > 10:
                self.zoom_signal.emit(True)
            elif self.__zoom < 10:
                self.zoom_signal.emit(False)
            else:
                self.__zoom = 0
    
    
    
    if __name__ == '__main__':
        import sys
        app = QtWidgets.QApplication(sys.argv)
        window = testUi()
        window.setGeometry(500, 300, 800, 600)
        window.show()
        sys.exit(app.exec_())
    

    所以我有一些“wheelEvent”帮助我放大/缩小QGraphicScene,其中我有“Rect”。如果缩放太大,我现在想隐藏“Rect”。谢谢你的时间。

    附笔

    1 回复  |  直到 6 年前
        1
  •  1
  •   eyllanesc Yonghwan Shin    6 年前

    self.__zoom 永远不会大于10,让我们分析一下我指出的:最初的值是0,假设当它达到9的值时,它一个接一个地上升,现在表达式 else: self .__ zoom = 0 将导致值重置为0,因此在最佳情况下,值将从0变为9,并将被重置。所以这是不必要的。如果去掉,变量就不能减少,所以当delta为负时,值就应该减少。

    使项目相对于 zoom_signal setVisible() 方法。

    def drawSomething(self):
        path = QtGui.QPainterPath( )
        path.moveTo(0, 0)
        path.addRect(20, 20, 60, 60)
        item = self._scene.addPath(path)
        item.setPen(QtGui.QPen(QtGui.QColor(79, 106, 25), 1, QtCore.Qt.SolidLine, QtCore.Qt.FlatCap, QtCore.Qt.MiterJoin))
        item.setBrush(QtGui.QColor(122, 163, 39))
        self.zoom_signal.connect(item.setVisible)
    
    
    def wheelEvent(self, event):
        if event.angleDelta().y() > 0:
            factor = 1.25
            self.__zoom += 1
        else:
            factor = 0.8
            self.__zoom -= 1
        self.scale(factor, factor)
        self.zoom_signal.emit(self.__zoom < 10)