网格布局中QLabel的几何形状

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

我正在尝试将Qlabels的几何图形添加到gridlayout中,我试图为添加到布局中的所有Qwidget设置所有几何图形,但是代码仍无法按预期工作。在将Qwidgets添加到gridlayout之前,代码运行正常。此代码基本上用于通过使用可拖动的Qlabel将图像分割为三个图像。

下面是代码

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QLabel, QWidget
from PyQt5.QtGui import QPixmap, QCursor
from PyQt5.QtCore import Qt
import sys


class DraggableLabel(QtWidgets.QLabel):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setStyleSheet("border-color: rgb(128,0,0) ;background: transparent;")
        self.setCursor(QtGui.QCursor(QtCore.Qt.OpenHandCursor))
        self.setFrameShape(QtWidgets.QFrame.Box)
        self.setLineWidth(2)
        self.origin = None

    def setLimits(self, rect):
        self.limits = rect

    def mousePressEvent(self, event):
        if not self.origin:
            # update the origin point
            self.origin = self.pos()
        if event.button() == Qt.LeftButton:
            self.mousePos = event.pos()

    def mouseMoveEvent(self, event):
        if event.buttons() == Qt.LeftButton:
            # move the box
            self.move(self.pos() + event.pos() - self.mousePos)

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            # if the box is not within the image boundaries, move it
            # back to the original position
            if not self.limits.contains(self.geometry()):
                self.move(self.origin)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1270, 800)
        MainWindow.setMinimumSize(QtCore.QSize(1270, 800))
        MainWindow.setMaximumSize(QtCore.QSize(1270, 800))
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("images.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        MainWindow.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")  
        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox.setMinimumSize(QtCore.QSize(210, 110))
        self.groupBox.setMaximumSize(QtCore.QSize(210, 110))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei")
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.groupBox.setFont(font)
        self.groupBox.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.groupBox.setObjectName("groupBox")
        self.checkBox_Short = QtWidgets.QCheckBox(self.groupBox)
        self.checkBox_Short.setGeometry(QtCore.QRect(20, 40, 141, 23))
        font = QtGui.QFont()
        font.setFamily("Adobe Heiti Std R")
        font.setPointSize(10)
        self.checkBox_Short.setFont(font)
        self.checkBox_Short.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.checkBox_Short.setObjectName("checkBox_Short")
        self.checkBox_Short.setEnabled(False)
        self.checkBox_Long = QtWidgets.QCheckBox(self.groupBox)
        self.checkBox_Long.setGeometry(QtCore.QRect(20, 80, 141, 23))
        font = QtGui.QFont()
        font.setFamily("Adobe Heiti Std R")
        font.setPointSize(10)
        self.checkBox_Long.setFont(font)
        self.checkBox_Long.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.checkBox_Long.setObjectName("checkBox_Long")    
        self.gridLayout.addWidget(self.groupBox, 1, 1, 1, 1)
        self.checkBox_Long.setEnabled(False)
        self.ImageViewlable = QtWidgets.QLabel(self.centralwidget)
        self.ImageViewlable.setMinimumSize(QtCore.QSize(600, 500))
        self.ImageViewlable.setMaximumSize(QtCore.QSize(600, 500))
        self.ImageViewlable.setGeometry(QtCore.QRect(13, 44, 600, 500))
        self.ImageViewlable.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.ImageViewlable.setFrameShape(QtWidgets.QFrame.Box)
        self.ImageViewlable.setFrameShadow(QtWidgets.QFrame.Plain)
        self.ImageViewlable.setLineWidth(1)
        self.ImageViewlable.setText("")
        self.ImageViewlable.setObjectName("ImageViewlable")
        self.gridLayout.addWidget(self.ImageViewlable, 0, 0, 1, 2)
        self.BrowesImageButton = QtWidgets.QPushButton(self.centralwidget)
        self.BrowesImageButton.setMinimumSize(QtCore.QSize(200, 60))
        self.BrowesImageButton.setMaximumSize(QtCore.QSize(200, 60))
        self.BrowesImageButton.setGeometry(QtCore.QRect(13, 609, 200, 60))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei UI")
        font.setPointSize(11)
        font.setBold(True)
        font.setWeight(75)
        self.BrowesImageButton.setFont(font)
        self.BrowesImageButton.setCheckable(True)
        self.BrowesImageButton.setObjectName("BrowesImageButton")
        self.gridLayout.addWidget(self.BrowesImageButton, 1, 0, 1, 1)        
        self.SegmentImageButton = QtWidgets.QPushButton(self.centralwidget)
        self.SegmentImageButton.setMinimumSize(QtCore.QSize(200, 60))
        self.SegmentImageButton.setMaximumSize(QtCore.QSize(200, 60))
        self.SegmentImageButton.setGeometry(QtCore.QRect(634, 609, 200, 60))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei UI")
        font.setPointSize(11)
        font.setBold(True)
        font.setWeight(75)
        self.SegmentImageButton.setFont(font)
        self.SegmentImageButton.setCheckable(True)
        self.SegmentImageButton.setObjectName("SegmentImageButton")
        self.SegmentImageButton.setEnabled(False)
        self.gridLayout.addWidget(self.SegmentImageButton, 1, 3, 1, 1)

        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)


class Window(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        self.label_1 = DraggableLabel(self)
        self.label_2 = DraggableLabel(self)
        self.label_3 = DraggableLabel(self) 

        self.label_1.setGeometry(QtCore.QRect(1059, 604, 60, 70))
        self.label_2.setGeometry(QtCore.QRect(1128, 604, 60, 70))
        self.label_3.setGeometry(QtCore.QRect(1197, 604, 60, 70))

        self.gridLayout.addWidget(self.label_1, 1, 4, 1, 1)
        self.gridLayout.addWidget(self.label_2, 1, 6, 1, 1)
        self.gridLayout.addWidget(self.label_3, 1, 7, 1, 1)

        self.labels = [self.label_1, self.label_2, self.label_3]
        for label in self.labels:
            label.hide()
            label.raise_()

        self.label_1.setToolTip("Drag it on First Character")
        self.label_2.setToolTip("Drag it on Second Character")
        self.label_3.setToolTip("Drag it on Third Character")

        self.BrowesImageButton.clicked.connect(self.load_image)
        self.checkBox_Short.stateChanged.connect(self.setBoxSizes)
        self.checkBox_Long.stateChanged.connect(self.setBoxSizes)
        self.SegmentImageButton.clicked.connect(self.segment)


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", " Image Segmentation"))
        self.groupBox.setTitle(_translate("MainWindow", "Choose Plate Type"))
        self.checkBox_Short.setText(_translate("MainWindow", "Short Plate"))
        self.checkBox_Long.setText(_translate("MainWindow", "Long Plate"))
        self.BrowesImageButton.setText(_translate("MainWindow", "Select Image"))
        self.SegmentImageButton.setText(_translate("MainWindow", "Segment"))

    def load_image(self):
        fileName, _ = QtWidgets.QFileDialog.getOpenFileName(
            None, "Select Image", "", "Image Files (*.png *.jpg *jpeg *.bmp)"
        )
        if fileName:
            pixmap = QtGui.QPixmap(fileName)
            pixmap = pixmap.scaled(self.ImageViewlable.width(), self.ImageViewlable.height(), QtCore.Qt.KeepAspectRatio) # Scale pixmap
            self.ImageViewlable.setPixmap(pixmap)
            self.ImageViewlable.setAlignment(QtCore.Qt.AlignCenter) 
            self.checkBox_Short.setEnabled(True)
            self.checkBox_Long.setEnabled(True)

    def setBoxSizes(self):
        if self.checkBox_Short.isChecked():
            boxSizeh = 70
            boxSizew = 60
            self.checkBox_Long.setEnabled(False)
            for label in self.labels:
                label.setFixedSize(boxSizew, boxSizeh)
                label.setLimits(self.ImageViewlable.geometry())
                label.show()
            self.SegmentImageButton.setEnabled(True)


        else: 
            self.checkBox_Long.setEnabled(True)

        if self.checkBox_Long.isChecked():
            boxSize = 65
            self.checkBox_Short.setEnabled(False)
            for label in self.labels:
                label.setFixedSize(boxSize, boxSize)
                label.setLimits(self.ImageViewlable.geometry())
                label.show()
            self.SegmentImageButton.setEnabled(True)

        else: 
            self.checkBox_Short.setEnabled(True)


    def segment(self):
        base_rect = self.ImageViewlable.geometry()
        for i, label in enumerate(self.labels, 1):
            label_r = label.geometry()
            res_rect = base_rect.intersected(label_r)
            if not res_rect.isNull():
                label.hide()
                pixmap = self.grab(res_rect)
                label.show()
                pixmap.save("Output_Image {}.png".format(i))

if __name__ == "__main__": 
    app = QtWidgets.QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec_())

下面是使用gridlayout之前的正确版本的代码:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QLabel, QWidget
from PyQt5.QtGui import QPixmap , QCursor
from PyQt5.QtCore import  Qt
import sys



class DraggableLabel(QtWidgets.QLabel):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setStyleSheet("border-color: rgb(128,0,0) ;background: transparent;")
        self.setCursor(QtGui.QCursor(QtCore.Qt.OpenHandCursor))
        self.setFrameShape(QtWidgets.QFrame.Box)
        self.setLineWidth(2)        
        self.origin = None

    def setLimits(self, rect):
        self.limits = rect

    def mousePressEvent(self, event):
        if not self.origin:
            # update the origin point
            self.origin = self.pos()
        if event.button() == Qt.LeftButton:
            self.mousePos = event.pos()

    def mouseMoveEvent(self, event):
        if event.buttons() == Qt.LeftButton:
            # move the box
            self.move(self.pos() + event.pos() - self.mousePos)

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            # if the box is not within the image boundaries, move it
            # back to the original position
            if not self.limits.contains(self.geometry()):
                self.move(self.origin)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1270, 800)
        MainWindow.setMinimumSize(QtCore.QSize(1050, 800))
        MainWindow.setMaximumSize(QtCore.QSize(1050, 800))
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("images.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)              
        self.BrowesImageButton = QtWidgets.QPushButton(MainWindow)
        self.BrowesImageButton.setGeometry(QtCore.QRect(820, 60, 200, 60))
        self.BrowesImageButton.setMinimumSize(QtCore.QSize(200, 60))
        self.BrowesImageButton.setMaximumSize(QtCore.QSize(200, 60))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei UI")
        font.setPointSize(11)
        font.setBold(True)
        font.setWeight(75)       
        self.BrowesImageButton.setFont(font)
        self.BrowesImageButton.setStyleSheet("")
        self.BrowesImageButton.setCheckable(True)
        self.BrowesImageButton.setObjectName("BrowesImageButton")
        self.groupBox = QtWidgets.QGroupBox(MainWindow)
        self.groupBox.setGeometry(QtCore.QRect(820, 170, 211, 131))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei")
        font.setPointSize(10)
        font.setBold(True)       
        font.setWeight(75)
        self.groupBox.setFont(font)
        self.groupBox.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.groupBox.setObjectName("groupBox")
        self.checkBox_Short = QtWidgets.QCheckBox(self.groupBox)
        self.checkBox_Short.setGeometry(QtCore.QRect(20, 40, 141, 23))
        font = QtGui.QFont()
        font.setFamily("Adobe Heiti Std R")
        font.setPointSize(10)     
        self.checkBox_Short.setFont(font)
        self.checkBox_Short.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.checkBox_Short.setObjectName("checkBox_Short")
        self.checkBox_Short.setEnabled(False)
        self.checkBox_Long = QtWidgets.QCheckBox(self.groupBox)
        self.checkBox_Long.setGeometry(QtCore.QRect(20, 80, 141, 23))
        font = QtGui.QFont()
        font.setFamily("Adobe Heiti Std R")
        font.setPointSize(10)  
        self.checkBox_Long.setFont(font)
        self.checkBox_Long.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.checkBox_Long.setObjectName("checkBox_Long")
        self.checkBox_Long.setEnabled(False)
        self.SegmentImageButton = QtWidgets.QPushButton(MainWindow)
        self.SegmentImageButton.setGeometry(QtCore.QRect(830, 330, 200, 60))
        self.SegmentImageButton.setMinimumSize(QtCore.QSize(200, 60))
        self.SegmentImageButton.setMaximumSize(QtCore.QSize(200, 60))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei UI")
        font.setPointSize(11)
        font.setBold(True)
        font.setWeight(75)
        self.SegmentImageButton.setFont(font)
        self.SegmentImageButton.setStyleSheet("")
        self.SegmentImageButton.setCheckable(True)
        self.SegmentImageButton.setObjectName("SegmentImageButton")
        self.SegmentImageButton.setEnabled(False)
        self.ImageViewlable = QtWidgets.QLabel(MainWindow)
        self.ImageViewlable.setGeometry(QtCore.QRect(40, 40, 750, 500))
        self.ImageViewlable.setMinimumSize(QtCore.QSize(750, 500))
        self.ImageViewlable.setMaximumSize(QtCore.QSize(750, 500))
        self.ImageViewlable.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.ImageViewlable.setFrameShadow(QtWidgets.QFrame.Plain)
        self.ImageViewlable.setLineWidth(1)
        self.ImageViewlable.setMidLineWidth(0)
        self.ImageViewlable.setText("")
        self.ImageViewlable.setScaledContents(False)
        self.ImageViewlable.setAlignment(QtCore.Qt.AlignCenter)
        self.ImageViewlable.setObjectName("ImageViewlable")
        self.retranslateUi(MainWindow)


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Image Segmentation"))
        self.BrowesImageButton.setText(_translate("MainWindow", "Select Image"))
        self.groupBox.setTitle(_translate("MainWindow", "Choose Plate Type"))
        self.checkBox_Short.setText(_translate("MainWindow", "Short Plate"))
        self.checkBox_Long.setText(_translate("MainWindow", "Long Plate"))
        self.SegmentImageButton.setText(_translate("MainWindow", "Segment Image"))

class Window(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

        self.label_1 = DraggableLabel(self)
        self.label_2 = DraggableLabel(self)
        self.label_3 = DraggableLabel(self)

        self.label_1.move(820, 470)
        self.label_2.move(900, 470)
        self.label_3.move(980, 470)

        self.labels = [self.label_1, self.label_2, self.label_3]
        for label in self.labels:
            label.hide()
            label.raise_()

        self.label_1.setToolTip( "Drag it on First charecter")
        self.label_2.setToolTip( "Drag it on Second charecter")
        self.label_3.setToolTip("Drag it on Third charecter")

        self.BrowesImageButton.clicked.connect(self.setImage)
        self.checkBox_Short.stateChanged.connect(self.setBoxSizes)
        self.checkBox_Long.stateChanged.connect(self.setBoxSizes)
        self.SegmentImageButton.clicked.connect(self.segment)



    def setImage(self):
        fileName, _ = QtWidgets.QFileDialog.getOpenFileName(None, "Select Image", "", "Image Files (*.png *.jpg *jpeg *.bmp)") # Ask for file

        if fileName: # If the user gives a file
            pixmap = QtGui.QPixmap(fileName) # Setup pixmap with the provided image
            pixmap = pixmap.scaled(self.ImageViewlable.width(), self.ImageViewlable.height(), QtCore.Qt.KeepAspectRatio) # Scale pixmap
            self.ImageViewlable.setPixmap(pixmap) # Set the pixmap onto the label
            self.ImageViewlable.setAlignment(QtCore.Qt.AlignCenter) # Align the label to center
            self.checkBox_Short.setEnabled(True)
            self.checkBox_Long.setEnabled(True)

    def setBoxSizes(self):
        if self.checkBox_Short.isChecked():
            boxSizeh = 80
            boxSizew = 90
            self.checkBox_Long.setEnabled(False)
            for label in self.labels:
                label.setFixedSize(boxSizeh, boxSizew)
                label.setLimits(self.ImageViewlable.geometry())
                label.show()
            self.SegmentImageButton.setEnabled(True)


        else: 
            self.checkBox_Long.setEnabled(True)

        if self.checkBox_Long.isChecked():
            boxSize = 65
            self.checkBox_Short.setEnabled(False)
            for label in self.labels:
                label.setFixedSize(boxSize, boxSize)
                label.setLimits(self.ImageViewlable.geometry())
                label.show()
            self.SegmentImageButton.setEnabled(True)

        else: 
            self.checkBox_Short.setEnabled(True)

    def segment(self):
        base_rect = self.ImageViewlable.geometry()
        for i, label in enumerate(self.labels, 1):
            label_r = label.geometry()
            res_rect = base_rect.intersected(label_r)
            if not res_rect.isNull():
                label.hide()
                pixmap = self.grab(res_rect)
                label.show()
                pixmap.save("Output_image_{}.png".format(i))


if __name__ == "__main__": 
    app = QtWidgets.QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec_())

有任何解决问题的建议吗?!

python python-3.x pyqt pyqt5
1个回答
0
投票

抱歉,我不知道您在拉窗时的想法,但是请尝试以下示例:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QLabel, QWidget
from PyQt5.QtGui import QPixmap, QCursor
from PyQt5.QtCore import Qt


class DraggableLabel(QtWidgets.QLabel):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setStyleSheet("border-color: rgb(128,0,0) ;background: transparent;")
        self.setCursor(QtGui.QCursor(QtCore.Qt.OpenHandCursor))
        self.setFrameShape(QtWidgets.QFrame.Box)
        self.setLineWidth(2)
        self.origin = None

    def setLimits(self, rect):
        self.limits = rect

    def mousePressEvent(self, event):
        if not self.origin:
            # update the origin point
            self.origin = self.pos()
        if event.button() == Qt.LeftButton:
            self.mousePos = event.pos()

    def mouseMoveEvent(self, event):
        if event.buttons() == Qt.LeftButton:
            # move the box
            self.move(self.pos() + event.pos() - self.mousePos)

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            # if the box is not within the image boundaries, move it
            # back to the original position
            if not self.limits.contains(self.geometry()):
                self.move(self.origin)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
#        MainWindow.resize(1270, 800)
        MainWindow.resize(830, 500)
#        MainWindow.setMinimumSize(QtCore.QSize(1270, 800))
#        MainWindow.setMaximumSize(QtCore.QSize(1270, 800))
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("images.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        MainWindow.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")  
        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox.setMinimumSize(QtCore.QSize(210, 110))
        self.groupBox.setMaximumSize(QtCore.QSize(210, 110))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei")
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.groupBox.setFont(font)
        self.groupBox.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.groupBox.setObjectName("groupBox")
        self.checkBox_Short = QtWidgets.QCheckBox(self.groupBox)
        self.checkBox_Short.setGeometry(QtCore.QRect(20, 40, 141, 23))
        font = QtGui.QFont()
        font.setFamily("Adobe Heiti Std R")
        font.setPointSize(10)
        self.checkBox_Short.setFont(font)
        self.checkBox_Short.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.checkBox_Short.setObjectName("checkBox_Short")
        self.checkBox_Short.setEnabled(False)
        self.checkBox_Long = QtWidgets.QCheckBox(self.groupBox)
        self.checkBox_Long.setGeometry(QtCore.QRect(20, 80, 141, 23))
        font = QtGui.QFont()
        font.setFamily("Adobe Heiti Std R")
        font.setPointSize(10)
        self.checkBox_Long.setFont(font)
        self.checkBox_Long.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.checkBox_Long.setObjectName("checkBox_Long")   

#        self.gridLayout.addWidget(self.groupBox, 1, 1, 1, 1)
        self.gridLayout.addWidget(self.groupBox, 1, 1, 1, 4)                 # +++

        self.checkBox_Long.setEnabled(False)
        self.ImageViewlable = QtWidgets.QLabel(self.centralwidget)
        self.ImageViewlable.setMinimumSize(QtCore.QSize(600, 500))
        self.ImageViewlable.setMaximumSize(QtCore.QSize(600, 500))
        self.ImageViewlable.setGeometry(QtCore.QRect(13, 44, 600, 500))
        self.ImageViewlable.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.ImageViewlable.setFrameShape(QtWidgets.QFrame.Box)
        self.ImageViewlable.setFrameShadow(QtWidgets.QFrame.Plain)
        self.ImageViewlable.setLineWidth(1)
        self.ImageViewlable.setText("")
        self.ImageViewlable.setObjectName("ImageViewlable")
#        self.gridLayout.addWidget(self.ImageViewlable, 0, 0, 1, 2)
        self.gridLayout.addWidget(self.ImageViewlable, 0, 0, 4, 1)           # +++

        self.BrowesImageButton = QtWidgets.QPushButton(self.centralwidget)
        self.BrowesImageButton.setMinimumSize(QtCore.QSize(200, 60))
        self.BrowesImageButton.setMaximumSize(QtCore.QSize(200, 60))
        self.BrowesImageButton.setGeometry(QtCore.QRect(13, 609, 200, 60))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei UI")
        font.setPointSize(11)
        font.setBold(True)
        font.setWeight(75)
        self.BrowesImageButton.setFont(font)
        self.BrowesImageButton.setCheckable(True)
        self.BrowesImageButton.setObjectName("BrowesImageButton")

#        self.gridLayout.addWidget(self.BrowesImageButton, 1, 0, 1, 1)    
        self.gridLayout.addWidget(self.BrowesImageButton, 0, 1, 1, 4)         # +++

        self.SegmentImageButton = QtWidgets.QPushButton(self.centralwidget)
        self.SegmentImageButton.setMinimumSize(QtCore.QSize(200, 60))
        self.SegmentImageButton.setMaximumSize(QtCore.QSize(200, 60))
        self.SegmentImageButton.setGeometry(QtCore.QRect(634, 609, 200, 60))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei UI")
        font.setPointSize(11)
        font.setBold(True)
        font.setWeight(75)
        self.SegmentImageButton.setFont(font)
        self.SegmentImageButton.setCheckable(True)
        self.SegmentImageButton.setObjectName("SegmentImageButton")
        self.SegmentImageButton.setEnabled(False)

#        self.gridLayout.addWidget(self.SegmentImageButton, 1, 3, 1, 1)
        self.gridLayout.addWidget(self.SegmentImageButton, 2, 1, 1, 4)         # +++

        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)


class Window(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        self.label_1 = DraggableLabel(self)
        self.label_2 = DraggableLabel(self)
        self.label_3 = DraggableLabel(self) 

#        self.label_1.setGeometry(QtCore.QRect(1059, 604, 60, 70))
#        self.label_2.setGeometry(QtCore.QRect(1128, 604, 60, 70))
#        self.label_3.setGeometry(QtCore.QRect(1197, 604, 60, 70))
#        self.gridLayout.addWidget(self.label_1, 1, 4, 1, 1)
#        self.gridLayout.addWidget(self.label_2, 1, 6, 1, 1)
#        self.gridLayout.addWidget(self.label_3, 1, 7, 1, 1)

        self.gridLayout.addWidget(self.label_1, 3, 1, 1, 1)         # +++
        self.gridLayout.addWidget(self.label_2, 3, 2, 1, 1)         # +++
        self.gridLayout.addWidget(self.label_3, 3, 3, 1, 1)         # +++
        self.gridLayout.setColumnStretch(4, 1)                      # +++
        self.gridLayout.setRowStretch(5, 1)                         # +++

        self.labels = [self.label_1, self.label_2, self.label_3]
        for label in self.labels:
            label.hide()
            label.raise_()
        self.label_1.setToolTip("Drag it on First Character")
        self.label_2.setToolTip("Drag it on Second Character")
        self.label_3.setToolTip("Drag it on Third Character")
        self.BrowesImageButton.clicked.connect(self.load_image)
        self.checkBox_Short.stateChanged.connect(self.setBoxSizes)
        self.checkBox_Long.stateChanged.connect(self.setBoxSizes)
        self.SegmentImageButton.clicked.connect(self.segment)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", " Image Segmentation"))
        self.groupBox.setTitle(_translate("MainWindow", "Choose Plate Type"))
        self.checkBox_Short.setText(_translate("MainWindow", "Short Plate"))
        self.checkBox_Long.setText(_translate("MainWindow", "Long Plate"))
        self.BrowesImageButton.setText(_translate("MainWindow", "Select Image"))
        self.SegmentImageButton.setText(_translate("MainWindow", "Segment"))

    def load_image(self):
        fileName, _ = QtWidgets.QFileDialog.getOpenFileName(
            None, "Select Image", "", "Image Files (*.png *.jpg *jpeg *.bmp)"
        )
        if fileName:
            pixmap = QtGui.QPixmap(fileName)
            pixmap = pixmap.scaled(self.ImageViewlable.width(), self.ImageViewlable.height(), QtCore.Qt.KeepAspectRatio) # Scale pixmap
            self.ImageViewlable.setPixmap(pixmap)
            self.ImageViewlable.setAlignment(QtCore.Qt.AlignCenter) 
            self.checkBox_Short.setEnabled(True)
            self.checkBox_Long.setEnabled(True)

    def setBoxSizes(self):
        if self.checkBox_Short.isChecked():
            boxSizeh = 70
            boxSizew = 60
            self.checkBox_Long.setEnabled(False)
            for label in self.labels:
                label.setFixedSize(boxSizew, boxSizeh)
                label.setLimits(self.ImageViewlable.geometry())
                label.show()
            self.SegmentImageButton.setEnabled(True)
        else: 
            self.checkBox_Long.setEnabled(True)

        if self.checkBox_Long.isChecked():
            boxSize = 65
            self.checkBox_Short.setEnabled(False)
            for label in self.labels:
                label.setFixedSize(boxSize, boxSize)
                label.setLimits(self.ImageViewlable.geometry())
                label.show()
            self.SegmentImageButton.setEnabled(True)
        else: 
            self.checkBox_Short.setEnabled(True)

    def segment(self):
        base_rect = self.ImageViewlable.geometry()
        for i, label in enumerate(self.labels, 1):
            label_r = label.geometry()
            res_rect = base_rect.intersected(label_r)
            if not res_rect.isNull():
                label.hide()
                pixmap = self.grab(res_rect)
                label.show()
                pixmap.save("Output_Image {}.png".format(i))

if __name__ == "__main__": 
    app = QtWidgets.QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec_())

enter image description here

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