绘制第一次实例化的对象,但不会通过Paint Event再次绘制

问题描述 投票:0回答:1

我有一个python代码,在图像上绘制一个圆圈。我想用滑块的输入来更新圆的位置。移动滑块将圆移动到对角线位置。

第一次调用代码时会画圆圈。但是在更新滑块位置时不会更新圆。

控制台打印输出:

QPainter::begin: Painter already active

实例化QPainter对象时。不知道这是否是问题的原因。

代码

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QPainter, QFont, QColor, QPixmap, QPen, QBrush
from PyQt5.QtCore import Qt, QRect, QPoint
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

from DUI import Ui_MainWindow



class BubbleCalc():
    def __init__(self,xpos,ypos,travel):
        super().__init__()
        self.zx = xpos
        self.zy = ypos
        self.travel = travel
    def CalcBubblePosition(self,Tilt):
        import math
        vector = math.sqrt(Tilt[0]*Tilt[0]+Tilt[1]*Tilt[1])
        try:
            angle = math.atan(Tilt[1]/Tilt[0])
        except:
            #deivide by zero
            if(Tilt[1] <0):
                angle = -90
            else:
                angle = 90
        print(f"Vector Length: {vector}")
        #setup the different zoom color         
        if(vector > 30):    
        #limit the maximum angle
            Tilt[0] = 30 * math.cos(angle)
            Tilt[1] = 30 * math.sin(angle)
            Color = (255,43,0,255)
            #print(f"limit maximum range vector = {vector}Angle{angle},xpos={xp},ypos={yp}")
        elif vector>10:
            Color = (255,69,0,127)
        elif vector >5:
            Color = (153,153,0,127)
        else:
            Color = (21,171,0,127)
        xpos = Tilt[0] *self.travel/30 + self.zx
        ypos = Tilt[1] *self.travel/30 + self.zy                       
        return xpos,ypos,Color

class DUI(QtWidgets.QMainWindow,Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.xpos =30
        self.ypos =30
        self.bubble_size = 200
        self.calc_bubble = BubbleCalc(431,431,100)
        self.sldBubble.valueChanged.connect(self.UpdateBubble)
        self.sldBubble.setValue(30)

    def UpdateBubble(self):
        self.xpos = self.sldBubble.value()
        self.ypos = self.sldBubble.value()
        self.update()


    def paintEvent(self, event):
        qp = QPainter(self.lblbubble.pixmap())
        qp.begin(self)
        self.drawBubble(qp,[self.xpos,self.ypos])
        print("paint Event")
        qp.end()

    def drawBubble(self, qp,Tilt):
        xpos,ypos,color = self.calc_bubble.CalcBubblePosition(Tilt) 
        print(f"Position :{xpos},{ypos} Color :{color}")
        pen = QPen(Qt.white)
        pen.setWidth(3)
        brush = QBrush()
        qp.setBrush(brush)
        qp.setPen(pen)
        brush.setColor(QColor(*color))        
        brush.setStyle(Qt.SolidPattern)
        qp.setBrush(brush)          
        qp.drawEllipse(xpos,ypos, self.bubble_size, self.bubble_size)         

def main():

    app = QtWidgets.QApplication(sys.argv)
    D = DUI()
    D.showFullScreen()
    D.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

“”

python pyqt pyqt5 qpainter
1个回答
0
投票

此文件是使用QT创建者生成的UI文件通过pyuic5命令创建的。

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'Digirod.ui'
#
# Created by: PyQt5 UI code generator 5.13.2
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.setEnabled(True)
        MainWindow.resize(800, 480)
        MainWindow.setWindowTitle("DigirRod")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.lblMain = QtWidgets.QLabel(self.centralwidget)
        self.lblMain.setGeometry(QtCore.QRect(0, 0, 681, 481))
        self.lblMain.setText("")
        self.lblMain.setPixmap(QtGui.QPixmap("BM.jpg"))
        self.lblMain.setScaledContents(True)
        self.lblMain.setObjectName("lblMain")
        self.ButtonSim = QtWidgets.QPushButton(self.centralwidget)
        self.ButtonSim.setGeometry(QtCore.QRect(690, 80, 101, 41))
        self.ButtonSim.setObjectName("ButtonSim")
        self.ButtonDRO = QtWidgets.QPushButton(self.centralwidget)
        self.ButtonDRO.setGeometry(QtCore.QRect(690, 130, 101, 41))
        self.ButtonDRO.setObjectName("ButtonDRO")
        self.ButtonTilt = QtWidgets.QPushButton(self.centralwidget)
        self.ButtonTilt.setGeometry(QtCore.QRect(690, 180, 101, 41))
        self.ButtonTilt.setObjectName("ButtonTilt")
        self.ButtonEDM = QtWidgets.QPushButton(self.centralwidget)
        self.ButtonEDM.setGeometry(QtCore.QRect(690, 230, 101, 41))
        self.ButtonEDM.setObjectName("ButtonEDM")
        self.ButtonBM = QtWidgets.QPushButton(self.centralwidget)
        self.ButtonBM.setGeometry(QtCore.QRect(740, 310, 51, 41))
        self.ButtonBM.setStyleSheet("background-color:red;\n"
"color:white;\n"
"border-style:outset;\n"
"border-width:2px;\n"
"border-radius:10px;\n"
"border-color:black;\n"
"")
        self.ButtonBM.setCheckable(False)
        self.ButtonBM.setAutoRepeat(False)
        self.ButtonBM.setObjectName("ButtonBM")
        self.ButtonPT = QtWidgets.QPushButton(self.centralwidget)
        self.ButtonPT.setGeometry(QtCore.QRect(740, 380, 51, 41))
        self.ButtonPT.setStyleSheet("background-color:black;\n"
"color:white;\n"
"border-style:outset;\n"
"border-width:2px;\n"
"border-radius:10px;\n"
"border-color:black;\n"
"")
        self.ButtonPT.setCheckable(False)
        self.ButtonPT.setAutoRepeat(False)
        self.ButtonPT.setObjectName("ButtonPT")
        self.lblPointImage = QtWidgets.QLabel(self.centralwidget)
        self.lblPointImage.setGeometry(QtCore.QRect(700, 380, 31, 81))
        self.lblPointImage.setText("")
        self.lblPointImage.setPixmap(QtGui.QPixmap("PT_icon.bmp"))
        self.lblPointImage.setScaledContents(True)
        self.lblPointImage.setObjectName("lblPointImage")
        self.lblDGR = QtWidgets.QLabel(self.centralwidget)
        self.lblDGR.setGeometry(QtCore.QRect(260, 60, 121, 31))
        font = QtGui.QFont()
        font.setPointSize(24)
        self.lblDGR.setFont(font)
        self.lblDGR.setStyleSheet("color:red;\n"
"border-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(0, 0, 0, 255), stop:1 rgba(255, 255, 255, 255));")
        self.lblDGR.setObjectName("lblDGR")
        self.lblBM = QtWidgets.QLabel(self.centralwidget)
        self.lblBM.setGeometry(QtCore.QRect(240, 330, 61, 20))
        self.lblBM.setText("")
        self.lblBM.setObjectName("lblBM")
        self.lblTiltValue = QtWidgets.QLabel(self.centralwidget)
        self.lblTiltValue.setGeometry(QtCore.QRect(290, 280, 131, 21))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.lblTiltValue.setFont(font)
        self.lblTiltValue.setObjectName("lblTiltValue")
        self.lblBMImage = QtWidgets.QLabel(self.centralwidget)
        self.lblBMImage.setGeometry(QtCore.QRect(690, 310, 41, 41))
        self.lblBMImage.setText("")
        self.lblBMImage.setPixmap(QtGui.QPixmap("BM_icon.bmp"))
        self.lblBMImage.setScaledContents(True)
        self.lblBMImage.setObjectName("lblBMImage")
        self.btnConnectBT = QtWidgets.QPushButton(self.centralwidget)
        self.btnConnectBT.setGeometry(QtCore.QRect(690, 30, 101, 41))
        self.btnConnectBT.setObjectName("btnConnectBT")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(260, 40, 121, 21))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(330, 250, 31, 21))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.lblEDM = QtWidgets.QLabel(self.centralwidget)
        self.lblEDM.setGeometry(QtCore.QRect(360, 130, 111, 31))
        font = QtGui.QFont()
        font.setPointSize(24)
        self.lblEDM.setFont(font)
        self.lblEDM.setObjectName("lblEDM")
        self.lblbubble = QtWidgets.QLabel(self.centralwidget)
        self.lblbubble.setGeometry(QtCore.QRect(250, 310, 151, 151))
        self.lblbubble.setText("")
        self.lblbubble.setPixmap(QtGui.QPixmap("circuilarvial.jpeg"))
        self.lblbubble.setScaledContents(True)
        self.lblbubble.setObjectName("lblbubble")
        self.sldBubble = QtWidgets.QSlider(self.centralwidget)
        self.sldBubble.setGeometry(QtCore.QRect(60, 410, 160, 22))
        self.sldBubble.setMaximum(30)
        self.sldBubble.setOrientation(QtCore.Qt.Horizontal)
        self.sldBubble.setObjectName("sldBubble")
        MainWindow.setCentralWidget(self.centralwidget)
        self.actionProject = QtWidgets.QAction(MainWindow)
        self.actionProject.setObjectName("actionProject")
        self.actionFile = QtWidgets.QAction(MainWindow)
        self.actionFile.setObjectName("actionFile")
        self.actionsave = QtWidgets.QAction(MainWindow)
        self.actionsave.setObjectName("actionsave")

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        self.ButtonSim.setText(_translate("MainWindow", "DGR Sim"))
        self.ButtonDRO.setText(_translate("MainWindow", "Stream DRO"))
        self.ButtonTilt.setText(_translate("MainWindow", "Stream Tilt"))
        self.ButtonEDM.setText(_translate("MainWindow", "Stream EDM"))
        self.ButtonBM.setText(_translate("MainWindow", "BM"))
        self.ButtonPT.setText(_translate("MainWindow", "Point"))
        self.lblDGR.setText(_translate("MainWindow", "00.000"))
        self.lblTiltValue.setText(_translate("MainWindow", "0.00,0.00"))
        self.btnConnectBT.setText(_translate("MainWindow", "Connect BT"))
        self.label.setText(_translate("MainWindow", "DGR Reading:"))
        self.label_2.setText(_translate("MainWindow", "Tilt"))
        self.lblEDM.setText(_translate("MainWindow", "00.000"))
        self.actionProject.setText(_translate("MainWindow", "Project"))
        self.actionFile.setText(_translate("MainWindow", "File"))
        self.actionsave.setText(_translate("MainWindow", "save"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
© www.soinside.com 2019 - 2024. All rights reserved.