要绘制在python使用QPainter内标签的矩形

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

我想根据我的标签内的百分比值来绘制矩形。所以,我知道我的标签的精确坐标是非常重要的。由于我使用多个窗口级联,都不能准确地检索到的当前窗口的位置全球。有一个简单的解决此问题的不改变我的整个编码布局?窗口2是其上显示为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)        
python pyqt
1个回答
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每次将绘制矩形,似乎当矩形标签内吸引到更快的工作。人们可以离开图像部分透明。

© www.soinside.com 2019 - 2024. All rights reserved.