在python中使用Qpainter在标签内绘制矩形

时间:2019-02-06 13:17:43

标签: python pyqt

我正在尝试根据标签内的百分比值绘制矩形。因此,重要的是要知道标签的确切坐标。由于我正在级联使用多个窗口,因此无法准确检索当前窗口的全局位置。在不更改我的整个编码布局的情况下,有没有解决此问题的简便方法? form2是我当前的视图,显示为form1的一部分。

如果我可以使用mapTo当前窗口中的某些小部件来映射标签的坐标,这可能会有所帮助。我的代码似乎可以正常工作,除了矩形的位置。我已经尝试过maptToGlobal()mapToParent()并且 self.label_pos = self.mapTo(self.frame, self.label_1.geometry().bottomLeft())我似乎无法使用self访问在父类中编写的小部件。还是我的语法有问题?

import Ui_ImageCrop # design of my window using Qt Designer
import math
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QMainWindow, QLabel
from PyQt5.QtGui import QPainter, QPen


class ImageCrop(Ui_ImageCrop.Ui_MainWindow, QMainWindow):

    def __init__(self, parent=None):
        super(ImageCrop,self ).__init__()
        self.setupUi(self)        


    def paintEvent(self,e): 
        painter  = QPainter(self)
        self.square1 = Show_Square()

        if self.lineEdit_1.text() == "":
            self.square1.percent = 0
        else:
            self.square1.percent = float(self.lineEdit_1.text())

        self.label_pos = self.mapTo(self, self.label_1.geometry().bottomLeft()) 
        self.square1.x = self.label_pos.x()             
        self.square1.y = self.label_pos.y()         
        self.square1.w = self.label_1.width()
        self.square1.h = self.label_1.height()
        self.square1.drawRectangles(painter)
        self.update()


class Show_Square(QLabel):

    def __init__(self):
        super(Show_Square,self).__init__()
        self.percent = 50
        self.x = 0
        self.y = 0
        self.w = 10
        self.h = 10       

    def drawRectangles(self, painter):        
        center_x = float(self.x+self.w/2)
        center_y = float(self.y+self.h/2)
        rect_crop = float(self.percent*self.w*self.h/100)
        k = float(self.h/self.w)

        rect_w = int(math.sqrt(rect_crop/k))
        rect_h = int(k*rect_w)
        rect_x = int(center_x-rect_h/2)
        rect_y = int(center_y-rect_w/2)

        painter.setPen(QPen(Qt.black, 1, Qt.SolidLine))
        painter.drawRect(rect_x,rect_y,rect_w,rect_h)        

1 个答案:

答案 0 :(得分:0)

这是我可以提出的解决方案。每个标签在我的布局中总共使用了三帧。因此,在添加了封闭框架的几何形状之后,就可以找到每个标签的位置。

frame1 = self.frame_1.geometry().topLeft()
frame2 = self.frame_2.geometry().topLeft()
frame3 = self.frame_3.geometry().topLeft()    
label1_topLeft = frame1 + frame2 + frame3 + self.label_1.geometry().topLeft()
label1_bottomRight = frame1 + frame2 + frame3 + self.label_1.geometry().bottomRight()

此外,与其在每次paintEvent中都通过在像素图上绘制来放置矩形,当在标签内部绘制矩形时,它似乎可以更快地工作。可能会使图像部分透明。