在enaml中是否有绘图/画布小部件?

2024-05-19 01:45:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我想让用户界面基本上是一个图像,用户可以用线连接的点来追踪路径。我希望它是跨平台的,所以我正在考虑试用enaml。不过,我不知道该怎么做。在

我已经看过文档和示例,但找不到任何类似画布小部件的东西。有没有可能用瓷漆在表面上任意绘制(点、线等)?在


Tags: 用户文档图像路径示例部件画布跨平台
1条回答
网友
1楼 · 发布于 2024-05-19 01:45:52

enaml没有canvas小部件,但是您可以使用RawWidget以及一个定制的QWidget和qpanter来绘制您需要的任何东西。在

from atom.api import Typed, Event
from enaml.widgets.api import Window, Container, RawWidget
from enaml.core.declarative import d_
from enaml.qt.QtCore import Qt
from enaml.qt.QtGui import QPainter, QPainterPath, QMouseEvent
from enaml.qt.QtWidgets import QWidget


class QtPaintWidget(QWidget):
    """ A widget that delegates drawing to enaml """
    def __init__(self, parent, widget):
        super(QtPaintWidget, self).__init__(parent)
        self.widget = widget

    def paintEvent(self, e):
        qp = QPainter()
        qp.begin(self)
        # Trigger the 'paint' event on th PaintWidget
        self.widget.paint(qp)
        qp.end()

    def mouseReleaseEvent(self, e):
        super(QtPaintWidget, self).mouseReleaseEvent(e)
        self.widget.mouse_event(e)


class PaintWidget(RawWidget):

    #: Push the paint event up to enaml
    paint = d_(Event(QPainter))

    #: Handle mouse event in enaml
    mouse_event = d_(Event(QMouseEvent))

    def create_widget(self, parent):
        return QtPaintWidget(parent, self)

    def update(self):
        self.proxy.widget.update()


enamldef Main(Window):
    Container:
        padding = 0
        PaintWidget: canvas:
            attr points = []
            minimum_size = (500, 500)
            paint ::
                # See https://doc.qt.io/qt-5/qpainter.html
                # for how to use the QPainter
                qp = change['value']
                qp.setBrush(Qt.white)
                qp.drawRect(0, 0, 500,  500)
                qp.setBrush(Qt.NoBrush)
                qp.setPen(Qt.blue)
                for p in points:
                    qp.drawPoint(p)
                qp.setPen(Qt.red)
                path = QPainterPath()
                if len(points) > 1:
                    for i, p in enumerate(points):
                        if i==0:
                            path.moveTo(p)
                        else:
                            path.lineTo(p)
                qp.drawPath(path)
            mouse_event ::
                # Save the position
                e = change['value']
                print(e)
                if e.button() == Qt.RightButton:
                    del points[:]
                else:
                    points.append(e.pos())
                canvas.update()

还有瓦拉

Drawing

您不必将paint事件推送到enaml,它只会使与其他小部件的交互更容易。有关在Qt中绘制的更多信息,请参见QtPainter docshttp://zetcode.com/gui/pyqt5/painting/。在

相关问题 更多 >

    热门问题