如何解决Pyside2中的2D可点击表面
我正在使用 PySide2 为项目编写一个简单的GUI界面。 我使用的是典型的MVC设计模式,为清楚起见,我将仅发布GUI的代码(不包含控制器和支持方法等)
这是代码:
from PySide2.QtWidgets import *
from PySide2.QtWidgets import QSizePolicy
from PySide2.QtGui import QIcon
from PySide2.QtWidgets import (QPushButton,QMainWindow)
class myView(QMainWindow):
def __init__(self,parent=None):
"""View initializer."""
#Creates blank view of a given size
super().__init__()
# Set some main window's properties
self.setWindowTitle('8D.me')
self.setFixedSize(800,500) # Block user resize of the window
self.setIcon()
self.generalLayout = QHBoxLayout() #Layout generale
self.button = QPushButton('test3',self)
self.button.setSizePolicy(
QSizePolicy.Preferred,QSizePolicy.Expanding)
self.generalLayout.addWidget(QPushButton('test2',self),1)
self.generalLayout.addWidget(self.button,3)
# Set the central widget
self._centralWidget = QWidget(self) #creates a QWidget object to play the role of a central widget. Remember that since your GUI class inherits from QMainWindow,you need a central widget. This object will be the parent for the rest of the GUI component.
self.setCentralWidget(self._centralWidget)
self._centralWidget.setLayout(self.generalLayout)
# Insert methods for creating/adding elements to the default view.
# Mehods....
def setIcon(self):
appIcon = QIcon('logo')
self.setWindowIcon(appIcon)
#Insert here the public methods called by the Controller to update the view...
我的GUI右号非常简单,看起来像这样:
我想做的是更改test 3
按钮并插入一个2D可单击的表面。
更详细地讲,我希望能够在此表面上的任意位置单击并获得鼠标单击的位置。
基本上,我想创建2D xy轴并检索鼠标单击的坐标,如下所示:
然后,如果我单击位置(1,1)
,我将打印出类似“您单击了轴上的(1,1)的内容”的信息。
我到处寻找示例,教程和文档,但是找不到任何合适的工具来创建自己想要的东西。 PySide2软件包中是否有任何类可以帮助我?
解决方法
如果从字面上看,您的目标是在图像中获得X-Y平面,则可能的解决方案是使用QGraphicsView:
import math
import sys
from PySide2.QtCore import Signal,QPointF
from PySide2.QtGui import QColor,QPainterPath
from PySide2.QtWidgets import (
QApplication,QGraphicsScene,QGraphicsView,QHBoxLayout,QMainWindow,QPushButton,QWidget,)
class GraphicsScene(QGraphicsScene):
clicked = Signal(QPointF)
def drawBackground(self,painter,rect):
l = min(rect.width(),rect.height()) / 30
x_left = QPointF(rect.left(),0)
x_right = QPointF(rect.right(),0)
painter.drawLine(x_left,x_right)
right_triangle = QPainterPath()
right_triangle.lineTo(-0.5 * math.sqrt(3) * l,0.5 * l)
right_triangle.lineTo(-0.5 * math.sqrt(3) * l,-0.5 * l)
right_triangle.closeSubpath()
right_triangle.translate(x_right)
painter.setBrush(QColor("black"))
painter.drawPath(right_triangle)
y_top = QPointF(0,rect.top())
y_bottom = QPointF(0,rect.bottom())
painter.drawLine(y_top,y_bottom)
top_triangle = QPainterPath()
top_triangle.lineTo(.5*l,-0.5 * math.sqrt(3) * l)
top_triangle.lineTo(-.5*l,-0.5 * math.sqrt(3) * l)
top_triangle.closeSubpath()
top_triangle.translate(y_bottom)
painter.setBrush(QColor("black"))
painter.drawPath(top_triangle)
def mousePressEvent(self,event):
sp = event.scenePos()
self.clicked.emit(sp)
super().mousePressEvent(event)
class MyView(QMainWindow):
def __init__(self,parent=None):
super().__init__(parent)
self.setWindowTitle("8D.me")
self.setFixedSize(800,500)
self.btn = QPushButton("test2")
self.view = QGraphicsView()
self.view.scale(1,-1)
self.scene = GraphicsScene()
self.view.setScene(self.scene)
central_widget = QWidget()
self.setCentralWidget(central_widget)
layout = QHBoxLayout(central_widget)
layout.addWidget(self.btn)
layout.addWidget(self.view)
self.scene.clicked.connect(self.handle_clicked)
def handle_clicked(self,p):
print("clicked",p.x(),p.y())
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MyView()
w.show()
sys.exit(app.exec_())
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。