작은 삼각형을 그린 사용자 지정 위젯을 만들었습니다. 위젯 위에 그린 삼각형 위로 마우스를 가져 가면 커서를 변경할 수 있는지 알고 싶습니다.
참고 : 사용을 시도했지만 mouseMoveEvent
클릭하지 않으면 업데이트되지 않습니다. 나도 시도 eventFilter
했지만 그 방법을 입력하지 않은 것 같습니다.
다음은 동일하지 않은 유사한 코드입니다. 삼각형은 맨 아래에 있습니다. 커서가 빨간색 삼각형 위에있을 때 자동으로 업데이트되도록하고 싶습니다.
from PyQt5.QtCore import Qt, QPoint, QPointF, QEvent
from PyQt5.QtGui import QPainter, QIcon, QColor
from PyQt5.QtWidgets import *
from PyQt5 import QtCore
import sys
class Stack(QWidget):
def __init__(self, parent=None):
super(Stack, self).__init__(parent)
self.cursor_x = [x for x in range(self.width() - 20, self.width())]
self.cursor_y = [y for y in range(self.height() - 20, self.height())]
def paintEvent(self, event):
super(Stack, self).paintEvent(event)
qp = QPainter(self)
qp.setPen(Qt.white)
qp.setBrush(Qt.white)
qp.drawRect(10, 10, 150, 150)
p = QPointF(self.width() - 20, self.height() - 10)
q = QPointF(self.width() - 10, self.height() - 20)
r = QPointF(self.width() - 10, self.height() - 10)
qp.setPen(Qt.white)
qp.setBrush(Qt.red)
qp.drawPolygon(p, q, r)
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
if event.x() in self.cursor_x and event.y() in self.cursor_y:
print('yes')
self.setCursor(QtCore.Qt.SizeFDiagCursor)
super().mousePressEvent(event)
def mouseMoveEvent(self, event):
if event.x() in self.cursor_x and event.y() in self.cursor_y:
self.setCursor(QtCore.Qt.SizeFDiagCursor)
super(Stack, self).mouseMoveEvent(event)
def eventFilter(self, obj, event):
print(event)
print('hello')
if obj is self and event.type() == QEvent.HoverEnter:
print("Mouse is over the label")
super().eventFilter(event)
def mouseReleaseEvent(self, event):
if event.x() not in self.cursor_x and event.y() not in self.cursor_y:
self.unsetCursor()
super(Stack, self).mouseReleaseEvent(event)
if __name__ == "__main__":
app = QApplication(sys.argv)
win = Stack()
win.show()
sys.exit(app.exec_())
커서가 영역 밖에있을 때도 커서를 비활성화해야합니다. mouseMoveEvent의 경우 mouseTracking 속성을 활성화해야합니다. 마지막으로 QPolygon을 사용하여 커서가 사각형 내부 또는 외부에 있는지 확인합니다.
class Stack(QWidget):
def __init__(self, parent=None):
super(Stack, self).__init__(parent)
self._triangle = QPolygon()
self.setMouseTracking(True)
def _recalculate_triangle(self):
p = QPoint(self.width() - 20, self.height() - 10)
q = QPoint(self.width() - 10, self.height() - 20)
r = QPoint(self.width() - 10, self.height() - 10)
self._triangle = QPolygon([p, q, r])
self.update()
def resizeEvent(self, event):
self._recalculate_triangle()
def paintEvent(self, event):
super(Stack, self).paintEvent(event)
qp = QPainter(self)
qp.setPen(Qt.white)
qp.setBrush(Qt.white)
qp.drawRect(10, 10, 150, 150)
qp.setPen(Qt.white)
qp.setBrush(Qt.red)
qp.drawPolygon(self._triangle)
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton and self._triangle.containsPoint(
event.pos(), Qt.OddEvenFill
):
self.setCursor(Qt.SizeFDiagCursor)
else:
self.unsetCursor()
def mouseMoveEvent(self, event):
if self._triangle.containsPoint(event.pos(), Qt.OddEvenFill):
self.setCursor(Qt.SizeFDiagCursor)
else:
self.unsetCursor()
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton and self._triangle.containsPoint(
event.pos(), Qt.OddEvenFill
):
self.setCursor(Qt.SizeFDiagCursor)
else:
self.unsetCursor()
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다