我想根据我的标签内的百分比值来绘制矩形。所以,我知道我的标签的精确坐标是非常重要的。由于我使用多个窗口级联,都不能准确地检索到的当前窗口的位置全球。有一个简单的解决此问题的不改变我的整个编码布局?窗口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)
这是我能拿出一个解决方案。共有三个框架是在我的布局为每个标签使用。因此,每个标签位置是在加入围框状的几何形状后发现。
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每次将绘制矩形,似乎当矩形标签内吸引到更快的工作。人们可以离开图像部分透明。