Чтобы нарисовать прямоугольники внутри метки, используя Qpainter в python - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь нарисовать прямоугольники в соответствии с процентным значением внутри моих меток.Поэтому для меня важно знать точные координаты моих этикеток.Так как я использую несколько окон в каскаде, глобальные позиции текущего окна не получены точно.Есть ли простой способ обойти эту проблему, не меняя всю структуру моего кода?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 голосов
/ 11 февраля 2019

Это решение, которое я мог бы предложить.Всего три кадра были использованы в моем макете для каждого ярлыка.Таким образом, позиции каждой метки были найдены после добавления геометрии вмещающей рамки.

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, кажется, что работает быстрее, когда прямоугольники нарисованы внутриэтикетки.Можно оставить изображения частично прозрачными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...