【问题标题】:pyqt drawing on an exsiting widget of GUIpyqt 在现有的 GUI 小部件上绘图
【发布时间】:2012-02-18 02:43:22
【问题描述】:

我是 pyqt 的新手。我正在做一个程序,它允许您单击图片并记住您单击的点的坐标并在 GUI 的小部件上绘制一个简笔画。我的代码现在可以提示一个新窗口来显示一个有 4 个点的多边形。但是,我希望它可以显示在我已经由pyqt制作的ui文件上。小部件的对象名称称为小部件。我希望有人可以帮助我修改代码以在gui小部件上显示多边形而不提示新窗口。

非常感谢!!!

import sys
from PyQt4.QtCore import *
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import *
from Main_window import *

global imgloc
imgloc = "1.jpg"
array = []
clicks = 0

class MyForm(QtGui.QMainWindow):

    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.local_image = QImage(imgloc)
        self.imageLocation = imgloc
        self.local_scene = QGraphicsScene()
        self.pixMapItem = QGraphicsPixmapItem(QPixmap(self.local_image), None, self.local_scene)
        self.ui.graphicsView_5.setScene( self.local_scene )
        self.pixMapItem.mousePressEvent = self.pixelSelect

    def pixelSelect(self,event):
        global imgloc
        a = event.pos().x()
        b = event.pos().y()
        global clicks
        global array
        if clicks != 4:
            clicks += 1
            point = QPoint(a,b)
            array.append(point)
        else:
            clicks = 0
            dialog = DialogBody()
            dialog.show()
            dialog.exec_()
            array = []

class DialogBody(QDialog):
    def __init__(self,parent=None):
        super(QDialog,self).__init__(parent)
        self.setGeometry(100, 100, QImage(imgloc).height(), QImage(imgloc).width())

    def paintEvent(self,e):
        qp = QtGui.QPainter()
        qp.begin(self)
        self.drawBody(qp)
        qp.end()

    def drawBody(self, qp):
        qp.setPen(QtCore.Qt.red)
        qp.drawPolygon(array[0],array[1],array[2],array[3])
        qp.drawEllipse(array[0],2,2)
        qp.drawEllipse(array[1],2,2)
        qp.drawEllipse(array[2],2,2)
        qp.drawEllipse(array[3],2,2)

if __name__ == "__main__":
   app = QtGui.QApplication(sys.argv)
   myapp= MyForm()
   myapp.show()
   sys.exit(app.exec_())

【问题讨论】:

    标签: python user-interface drawing pyqt


    【解决方案1】:

    您似乎想在QGraphicsScene 上绘制项目?在这种情况下,您可以将项目添加到场景中:

    #!/usr/bin/env python
    import sys
    
    from PyQt4 import QtCore, QtGui
    
    
    class MainWidget(QtGui.QWidget):
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self, parent)
            self.scene = QtGui.QGraphicsScene()
            self.view = QtGui.QGraphicsView(self.scene)
            layout = QtGui.QVBoxLayout()
            layout.addWidget(self.view)
            self.setLayout(layout)
            self.pixmap_item = QtGui.QGraphicsPixmapItem(QtGui.QPixmap('image.png'), None, self.scene)
            self.pixmap_item.mousePressEvent = self.pixelSelect
            self.click_positions = []
    
        def pixelSelect(self, event):
            self.click_positions.append(event.pos())
            if len(self.click_positions) < 4:
                return
            pen = QtGui.QPen(QtCore.Qt.red)
            self.scene.addPolygon(QtGui.QPolygonF(self.click_positions), pen)
            for point in self.click_positions:
                self.scene.addEllipse(point.x(), point.y(), 2, 2, pen)
            self.click_positions = []
    
    
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        widget = MainWidget()
        widget.resize(640, 480)
        widget.show()
        sys.exit(app.exec_())
    

    QGraphicsScene 有很多功能。

    在 Qt 文档中阅读 Graphics View Framework overview

    【讨论】:

    • 最后一个例子给了我一些实际工作的有用代码!
    • 如何在某个位置添加另一个 image.png?例如,我需要小图像而不是椭圆,我尝试使用 addPixmap 和 addItem,但没有一个成功。请帮帮我
    • item = self.scene.addPixmap(QtGui.QPixmap('some_image.png')) 应该可以工作。但是它将图像添加到 (0, 0) 位置,因此您需要更改它:item.setPos(position),其中position 可以是例如event.pos()
    猜你喜欢
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多