我正在尝试根据标签内的百分比值绘制矩形。因此,重要的是要知道标签的确切坐标。由于我正在级联使用多个窗口,因此无法准确检索当前窗口的全局位置。在不更改我的整个编码布局的情况下,有没有解决此问题的简便方法? 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)
答案 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中都通过在像素图上绘制来放置矩形,当在标签内部绘制矩形时,它似乎可以更快地工作。可能会使图像部分透明。