Моя проблема: я хочу «скрыть/показать», «изменить цвет» некоторых элементов в зависимости от уровня масштабирования в моем пользовательском интерфейсе, но я полностью потерялся на всех форумах 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 и кормить меня с ложечки, как ребенка, я очень ценю это! Я немного тупица в этом деле.
С вашим кодом переменная 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)
@Vlad поменяй на self.zoom_signal.emit(self.__zoom > 5)
и добавь item.hide()
после item = self._scene.addPath(path)
Мне немного интересно, как работает этот сигнал. Что, если я хочу иметь противоположное поведение, оно будет скрыто до 5 и после будет показано. Поскольку я не могу передать "setVisibile" true или false