Как скрыть определенные элементы в QGraphicScene?

Моя проблема: я хочу «скрыть/показать», «изменить цвет» некоторых элементов в зависимости от уровня масштабирования в моем пользовательском интерфейсе, но я полностью потерялся на всех форумах 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», если масштаб слишком велик. Спасибо за ваше время.

P.S. Я знаю, что есть несколько парней, которые всегда помогают мне шаг за шагом понять Qt и кормить меня с ложечки, как ребенка, я очень ценю это! Я немного тупица в этом деле.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
212
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С вашим кодом переменная self.__zoom никогда не будет больше 10, давайте проанализируем то, что я указываю: изначально значение равно 0, предполагая, что оно увеличивается один за другим, когда достигает значения девять, и теперь выражение else: self .__ zoom = 0 вызовет сброс значения на 0, поэтому значение в лучшем случае изменится с 0 на 9 и будет сброшено. Так что еще и ненужно. Если мы удалим, переменная не может быть уменьшена, поэтому значение должно быть уменьшено, когда дельта отрицательна.

Чтобы сделать элемент видимым по отношению к сигналу 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)

Мне немного интересно, как работает этот сигнал. Что, если я хочу иметь противоположное поведение, оно будет скрыто до 5 и после будет показано. Поскольку я не могу передать "setVisibile" true или false

Vlad 09.04.2019 07:21

@Vlad поменяй на self.zoom_signal.emit(self.__zoom > 5) и добавь item.hide() после item = self._scene.addPath(path)

eyllanesc 09.04.2019 07:22

Другие вопросы по теме