Python 使用paintEvent在QLabel中绘制
我想在某个标签上画一个矩形,我用QtDesigner制作了一个GUI,它在一个名为“class Ui_MainWindow(QMainWindow):”的类中生成整个GUI代码,我在窗口中使用了三个选项卡 我在标签上使用QMouseEvent时遇到问题,我找到了使用此代码的解决方案Python 使用paintEvent在QLabel中绘制,python,pyqt,pyqt5,qt-designer,qlabel,Python,Pyqt,Pyqt5,Qt Designer,Qlabel,我想在某个标签上画一个矩形,我用QtDesigner制作了一个GUI,它在一个名为“class Ui_MainWindow(QMainWindow):”的类中生成整个GUI代码,我在窗口中使用了三个选项卡 我在标签上使用QMouseEvent时遇到问题,我找到了使用此代码的解决方案 from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import Qt import sys import cv2 from PyQt5.QtWi
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
import sys
import cv2
from PyQt5.QtWidgets import QMainWindow, QWidget, QLabel
from PyQt5.QtGui import QPixmap, QImage
class Ui_MainWindow(QMainWindow):
def __init__(self):
# super(Ui_MainWindow, self).__init__ ()
super().__init__()
self.count = 0
self.frame = 0
self.fileName="0"
self.imagesTab2 = []
self.k = 0
self.i = 1
self.w = 0
self.h = 0
self.coordPt = []
self.dictListClasses = {
"face" :[],
"car" : [] }
self.dictColorClasses = {
"face" :(0, 100, 255),
"car" : (0,255, 0) }
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(655, 364)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.tab)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.pushButton = QtWidgets.QPushButton(self.tab)
self.pushButton.setObjectName("pushButton")
self.horizontalLayout.addWidget(self.pushButton)
self.verticalLayout_2.addLayout(self.horizontalLayout)
self.label = QtWidgets.QLabel(self.tab)
self.label.setText("")
self.label.setObjectName("label")
self.label.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.label.setFrameShadow(QtWidgets.QFrame.Sunken)
self.setMouseEventDelegate(self.label)
self.verticalLayout_2.addWidget(self.label)
self.verticalLayout_2.setStretch(1, 1)
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.tabWidget.addTab(self.tab_2, "")
self.verticalLayout.addWidget(self.tabWidget)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 655, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "Open"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2"))
self.pushButton.clicked.connect(self.openFileTab2)
def setMouseEventDelegate (self, setQWidget):
def subWidgetMousePressEvent(e: QtGui.QMouseEvent):
if self.imagesTab2:
if e.button() == Qt.LeftButton:
po = int(e.x()*self.w/self.label.width())
pa = int(e.y()*self.h/self.label.height())
self.coordPt = [(po, pa)]
print("coords click = ", self.coordPt)
self.begin = e.pos()
self.end = e.pos()
self.label.update()
print("begin 1= ",self.begin, self.end)
def subWidgetMouseMoveEvent(e: QtGui.QMouseEvent):
if self.imagesTab2:
self.end = e.pos()
self.label.update()
def subWidgetMouseReleaseEvent(e: QtGui.QMouseEvent):
if e.button() == Qt.LeftButton:
if self.imagesTab2:
if e.x() >= 0 and e.y() >= 0 and e.x()<self.label.width() and e.y()<self.label.height():
po = int(e.x()*self.w/self.label.width())
pa = int(e.y()*self.h/self.label.height())
self.coordPt.append((po, pa))
print("coords release = ", self.coordPt)
self.begin = e.pos()
self.end = e.pos()
self.label.update()
print("begin 2= ",self.begin, self.end)
self.dictListClasses["car"].append(self.coordPt)
print("LL + ", self.dictListClasses)
setQWidget.mousePressEvent = subWidgetMousePressEvent
setQWidget.mouseReleaseEvent = subWidgetMouseReleaseEvent
setQWidget.mouseMoveEvent = subWidgetMouseMoveEvent
def openFileTab2(self):
self.imagesTab2, _ = QtWidgets.QFileDialog.getOpenFileNames(None,"Select one or more images to open", "/Images","Images (*.jpg *.jpeg .*bmp .*png);;All Files (*)")
if self.imagesTab2:
self.showImageInLabel(self.imagesTab2[0])
# self.label_9.setText("Image 1")
def showImageInLabel(self, img):
pix = QPixmap(img)
self.w = pix.width()
self.h = pix.height()
print("Image resolution = ", '(',self.w,')', '(',self.h,')')
pix = pix.scaled(self.size(), aspectRatioMode=QtCore.Qt.KeepAspectRatio, ) # To scale image for example and keep its Aspect Ration
self.label.setPixmap(pix)
self.label.setScaledContents(True)
def nextImageTab2(self):
if not self.imagesTab2:
print("No files, please open one or more images")
return
if self.i < len(self.imagesTab2):
path = self.imagesTab2[self.i]
self.showImageInLabel(path)
self.i += 1
print(self.i)
x = "Image " + str(self.i)
# self.label_9.setText(x)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
解决方案是将Labella推广到Qt Designer中使用,为此必须首先创建文件Labella.py labella.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Labella(QtWidgets.QLabel):
def __init__(self, parent):
super().__init__(parent=parent)
self.setStyleSheet('QFrame {background-color:white;}')
self.resize(300, 300)
self.begin = QtCore.QPoint()
self.end = QtCore.QPoint()
def paintEvent(self, event):
super().paintEvent(event)
qp = QtGui.QPainter(self)
br = QtGui.QBrush(QtGui.QColor(100, 10, 10, 40))
qp.setBrush(br)
qp.drawRect(QtCore.QRect(self.begin, self.end))
def mousePressEvent(self, event):
self.begin = event.pos()
self.end = event.pos()
self.update()
print("beegin = ", self.begin)
print("end 1 = ", self.end)
def mouseMoveEvent(self, event):
self.end = event.pos()
self.update()
def drawRectangles(self, qp):
qp.setBrush(QColor(255, 0, 0, 100))
qp.save() # save the QPainter config
qp.drawRect(10, 15, 20, 20)
qp.setBrush(QColor(0, 0, 255, 100))
qp.drawRect(50, 15, 20, 20)
qp.restore() # restore the QPainter config
qp.drawRect(100, 15, 20, 20)
然后我们将labella.py和.ui放在同一个文件夹中,它们将调用mainwindow.ui
.
├── labella.py
└── mainwindow.ui
您可以通过获取以下信息来打开.ui文件:
按右键单击QLabel
,然后选择选项:升级到
如下图所示填写字段,然后按添加
按钮,然后按升级
按钮:
最后在pyuic5的帮助下再次生成.py:
pyuic5 mainwindow.ui -o mainwindow.py -x
是的,我希望它保留在最后的代码中,但这不是主要问题,这只是我正在测试的一个示例代码。。我的主代码是另一个由QtDesigner生成的代码,它有一个类似于我上面提到的类,我想做与上一个代码相同的事情,但它在我的主代码中不起作用,有没有一种方法可以在QMainWindow中的tabWidget中有这个标签时,如何绘制某个标签?谢谢你的重播如果我的问题不够清楚,我可以添加一两张图片来解释更多这是我的原始代码。。。我在上面编辑了它。。我已经剪切了第二个tabWidget的代码,所以不会太长,我没有问题。当然,我是通过电子邮件发送还是在这里共享代码?我认为注释不适合整个代码在pastebin上,因为代码太长了,谢谢你,它正在工作,但问题是它覆盖了pixmap,所以没有显示图像,我如何修复它,请你这么多,它是如此有用,如果可能的话,我有最后一件事,我希望矩形保持不变,因为它在我释放鼠标后消失了,你能帮我吗?很抱歉,我知道我问了很多问题,但对于初学者来说这有点难
pyuic5 mainwindow.ui -o mainwindow.py -x