Russian Qt Forum
Апрель 29, 2024, 01:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Перестает работать смена курсора в QGraphicsView  (Прочитано 1944 раз)
Dilettante
Новичок

Offline Offline

Сообщений: 2


Просмотр профиля
« : Март 19, 2021, 10:49 »

В приведенном примере возникает проблема при переопределении методов событий мыши.

View::QGraphicsView::mousePressEvent меняется курсор мыши, View::QGraphicsView::mouseReleaseEvent меняется на дефолтный.

Node::QGraphicsItem::mousePressEvent меняется курсор мыши, Node::QGraphicsItem::mouseReleaseEvent меняется на дефолтный.

Проблема: После клика по Node перестает работать смена курсора в представлении View.

Код
Python
#!/usr/bin/env python3
#-*- coding: utf-8 -*-
 
import sys
 
from PySide2.QtCore import Qt, QRectF
from PySide2.QtGui import QPainterPath, QPen, QColor
from PySide2.QtWidgets import QApplication, QMainWindow, QWidget, QGraphicsItem, QGraphicsView, QGraphicsScene, \
   QVBoxLayout
 
 
class MainWindow(QMainWindow):
   def __init__(self):
       super().__init__()
 
       self.setMinimumSize(300, 300)
       self.setGeometry(300, 300, 800, 600)
       self.editor = NNEditor()
       self.setCentralWidget(self.editor)
 
 
class NNEditor(QWidget):
   def __init__(self):
       super().__init__()
 
       self.scene = Scene()
       self.view = View(self.scene)
 
       self.setLayout(QVBoxLayout())
       self.layout().addWidget(self.view)
 
       self.node = Node()
       self.scene.addNode(self.node)
 
 
class Scene(QGraphicsScene):
   def __init__(self):
       super().__init__()
 
       self.colorBackground = QColor("#555555")
 
       self.setBackgroundBrush(self.colorBackground)
       self.sceneWidth, self.sceneHeight = 1000, 1000
       self.setSceneRect(~self.sceneWidth // 2, ~self.sceneHeight // 2,
                         self.sceneWidth, self.sceneHeight)
 
   def addNode(self, node):
       self.addItem(node)
 
   def drawBackground(self, painter, rect):
       super().drawBackground(painter, rect)
 
 
class View(QGraphicsView):
   def __init__(self, scene):
       super().__init__()
 
       self.setScene(scene)
 
   def mousePressEvent(self, event):
       if event.button() == Qt.LeftButton:
           self.setCursor(Qt.ClosedHandCursor)
       super().mousePressEvent(event)
 
   def mouseReleaseEvent(self, event):
       if event.button() == Qt.LeftButton:
           self.setCursor(Qt.ArrowCursor)
       super().mouseReleaseEvent(event)
 
 
class Node(QGraphicsItem):
   def __init__(self):
       super().__init__()
 
       self.width = 180
       self.height = 240
       self.radius = 10
 
       self.strokeWidth = 2
       self.pen = QPen(Qt.black, self.strokeWidth)
 
   def boundingRect(self):
       return QRectF(0, 0, self.width + self.strokeWidth, self.height + self.strokeWidth).normalized()
 
   def paint(self, painter, option, widget=None):
       path_outline = QPainterPath()
       path_outline.addRoundedRect(self.strokeWidth / 2, self.strokeWidth / 2,
                                   self.width, self.height,
                                   self.radius, self.radius)
 
       painter.setPen(self.pen)
       painter.setBrush(Qt.NoBrush)
       painter.drawPath(path_outline.simplified())
 
   def shape(self):
       path_outline = QPainterPath()
       path_outline.addRoundedRect(0, 0,
                                   self.width + self.strokeWidth, self.height + self.strokeWidth,
                                   self.radius, self.radius)
       return path_outline
 
   def mousePressEvent(self, event):
       if event.buttons() == Qt.LeftButton:
           self.setCursor(Qt.SizeAllCursor)
 
   def mouseReleaseEvent(self, event):
       if event.button() == Qt.LeftButton:
           self.setCursor(Qt.ArrowCursor)
 
 
if __name__ == '__main__':
   app = QApplication(sys.argv)
 
   wnd = MainWindow()
   wnd.show()
 
   sys.exit(app.exec_())
 

У меня получается решить данную проблему только если я в обоих случаях меняю курсор только в представлении. Т.е. либо в представлении определяю, что клик происходит по Item, либо при создании Item передаю в него View, что бы при событии менять курсор во View.
« Последнее редактирование: Март 19, 2021, 12:59 от Dilettante » Записан
Dilettante
Новичок

Offline Offline

Сообщений: 2


Просмотр профиля
« Ответ #1 : Март 19, 2021, 23:06 »

Решение - Ссылка
« Последнее редактирование: Март 19, 2021, 23:15 от Dilettante » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.072 секунд. Запросов: 22.