我正在尝试将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_())
有任何解决问题的建议吗?!
抱歉,我不知道您在拉窗时的想法,但是请尝试以下示例:
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_())