Python:如何在PyQt中在图像上绘制对象
我应用GridLabel定位对象。我在一间牢房里发现了灰色的图像。现在我只想在这个灰色单元格上画矩形。但它只能在这张灰色的照片下移动,也会从这个细胞的边界向外移动。我需要如何编写这部分代码,让我在这个灰色的图像上画画,并且不从它的边界中走出来Python:如何在PyQt中在图像上绘制对象,python,pyqt4,Python,Pyqt4,我应用GridLabel定位对象。我在一间牢房里发现了灰色的图像。现在我只想在这个灰色单元格上画矩形。但它只能在这张灰色的照片下移动,也会从这个细胞的边界向外移动。我需要如何编写这部分代码,让我在这个灰色的图像上画画,并且不从它的边界中走出来 from PyQt4 import QtGui, QtCore import sys, os class Example(QtGui.QWidget): def __init__(self,parent): super(Example, sel
from PyQt4 import QtGui, QtCore
import sys, os
class Example(QtGui.QWidget):
def __init__(self,parent):
super(Example, self).__init__()
self.main_image_name="main_image.png"
self.mode = 5
self.initUI()
def initUI(self):
File_name = QtGui.QLabel('Setup file name')
File_name_edit = QtGui.QLineEdit()
QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10))
#QMainWindow.statusBar().showMessage('Ready')
self.setGeometry(300, 300, 250, 150)
self.resize(640, 360)
self.center()
self.main_image = QtGui.QLabel(self)
self.main_image.setPixmap(QtGui.QPixmap(self.main_image_name))
btn = QtGui.QPushButton("Make setup file")
btn.setToolTip('Press <b>Detect</b> button for detecting objects by your settings')
btn.resize(btn.sizeHint())
btn.clicked.connect(QtCore.QCoreApplication.instance().quit)
btn_browse = QtGui.QPushButton("Browse")
btn_browse.clicked.connect(self.browse)
btn_set = QtGui.QPushButton("Set name")
#fullscreen
#self.main_image.setScaledContents(True)
#just centered
self.main_image.setAlignment(QtCore.Qt.AlignCenter)
#Layout
box_File_name = QtGui.QHBoxLayout()
box_File_name.addWidget(File_name)
box_File_name.addWidget(File_name_edit)
box_File_name.addWidget(btn_set)
grid = QtGui.QGridLayout()
grid.setSpacing(10)
grid.addLayout(box_File_name, 1, 0)
#grid.addWidget(File_name_edit, 1, 1)
grid.addWidget(self.main_image, 2, 0)
grid.addWidget(btn_browse, 3 , 0)
grid.addWidget(btn, 4, 0)
box_number = QtGui.QVBoxLayout()
number_group=QtGui.QButtonGroup() # Number group
r0=QtGui.QRadioButton("Traffic Lights")
number_group.addButton(r0)
r1=QtGui.QRadioButton("Direction")
number_group.addButton(r1)
r2=QtGui.QRadioButton("Traffic Lines H")
number_group.addButton(r2)
r3=QtGui.QRadioButton("Traffic Lines V")
number_group.addButton(r3)
box_number.addWidget(r0)
box_number.addWidget(r1)
box_number.addWidget(r2)
box_number.addWidget(r3)
r0.toggled.connect(self.radio0_clicked)
r1.toggled.connect(self.radio1_clicked)
r2.toggled.connect(self.radio2_clicked)
r3.toggled.connect(self.radio3_clicked)
box_road_sign = QtGui.QHBoxLayout()
road_sign_label = QtGui.QLabel('Road signs', self)
road_sign = QtGui.QComboBox()
road_sign.addItem("None")
road_sign.addItem("ex1")
road_sign.addItem("ex2")
road_sign.addItem("ex3")
road_sign.addItem("ex4")
road_sign.addItem("ex5")
box_road_sign.addWidget(road_sign_label)
box_road_sign.addWidget(road_sign)
grid.addLayout(box_road_sign, 1, 1)
grid.addLayout(box_number, 2, 1)
self.setLayout(grid)
self.show()
def browse(self):
w = QtGui.QWidget()
w.resize(320, 240)
w.setWindowTitle("Select Picture")
filename = QtGui.QFileDialog.getOpenFileName(w, 'Open File', '/')
self.main_image_name = filename
self.main_image.setPixmap(QtGui.QPixmap(self.main_image_name))
def center(self):
qr = self.frameGeometry()
cp = QtGui.QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())
def radio0_clicked(self, enabled):
if enabled:
print "0"
self.mode=0
def radio1_clicked(self, enabled):
if enabled:
print "1"
self.mode=1
def radio2_clicked(self, enabled):
if enabled:
print "2"
self.mode=2
def radio3_clicked(self, enabled):
if enabled:
print "3"
self.mode=3
def paintEvent( self, event) :
????
class menubarex(QtGui.QMainWindow):
def __init__(self, parent=None):
super(menubarex, self).__init__(parent)
self.form_widget = Example(self)
self.setCentralWidget(self.form_widget)
self.initUI()
def initUI(self):
exitAction = QtGui.QAction(QtGui.QIcon('exit.png'), '&Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')
exitAction.triggered.connect(QtGui.qApp.quit)
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAction)
#self.toolbar = self.addToolBar('Exit')
#self.toolbar.addAction(exitAction)
self.statusBar().showMessage('Ready')
self.setWindowTitle('mi ban')
self.setWindowIcon(QtGui.QIcon('icon.png'))
def closeEvent(self, event):
reply = QtGui.QMessageBox.question(self, 'Message',
"Are you sure to quit?", QtGui.QMessageBox.Yes |
QtGui.QMessageBox.No)
if reply == QtGui.QMessageBox.Yes:
event.accept()
else:
event.ignore()
def main():
app = QtGui.QApplication(sys.argv)
#ex = Example()
menubar = menubarex()
menubar.show()
sys.exit(app.exec_())
main()
从PyQt4导入QtGui,QtCore
导入系统,操作系统
类示例(QtGui.QWidget):
定义初始化(自身,父级):
super(例如,self)。\uuuuu init\uuuuuuuu()
self.main\u image\u name=“main\u image.png”
self.mode=5
self.initUI()
def initUI(self):
File_name=QtGui.QLabel('设置文件名')
文件名编辑=QtGui.QLineEdit()
QtGui.QToolTip.setFont(QtGui.QFont('SansSerif',10))
#QMainWindow.statusBar().showMessage('Ready')
self.setGeometry(300300250150)
自我调整大小(640360)
self.center()
self.main_image=QtGui.QLabel(self)
self.main_image.setPixmap(QtGui.QPixmap(self.main_image_name))
btn=QtGui.QPushButton(“生成设置文件”)
btn.setToolTip('按检测按钮以通过设置检测对象')
btn.resize(btn.sizeHint())
btn.clicked.connect(QtCore.QCoreApplication.instance().quit)
btn_browse=QtGui.QPushButton(“浏览”)
btn_浏览。点击。连接(self.browse)
btn_set=QtGui.QPushButton(“集合名称”)
#全屏
#self.main_image.setScaledContents(True)
#正中
self.main_image.setAlignment(QtCore.Qt.AlignCenter)
#布局
box\u File\u name=QtGui.QHBoxLayout()
box\u File\u name.addWidget(文件名)
box\u File\u name.addWidget(文件名编辑)
box\u File\u name.addWidget(btn\u集)
grid=QtGui.QGridLayout()
网格设置间距(10)
grid.addLayout(框文件名,1,0)
#addWidget(文件名编辑,1,1)
grid.addWidget(self.main_图像,2,0)
grid.addWidget(btn_浏览,3,0)
grid.addWidget(btn,4,0)
box_number=QtGui.QVBoxLayout()
数字组=QtGui.QButtonGroup()#数字组
r0=QtGui.QRadioButton(“交通灯”)
编号\组添加按钮(r0)
r1=QtGui.QRadioButton(“方向”)
编号\组添加按钮(r1)
r2=QtGui.QRadioButton(“交通线H”)
编号\组添加按钮(r2)
r3=QtGui.QRadioButton(“交通线V”)
编号\组添加按钮(r3)
box_number.addWidget(r0)
框号。添加小部件(r1)
框号。添加小部件(r2)
框号。添加小部件(r3)
r0.切换.连接(self.radio0_单击)
r1.切换.连接(自.无线电1_单击)
r2.切换.连接(自.无线电2_单击)
r3.切换。连接(self.radio3_单击)
方框\道路\标志=QtGui.QHBoxLayout()
道路标志标签=QtGui.QLabel(“道路标志”,自)
道路标志=QtGui.QComboBox()
道路附加标志(“无”)
道路附加标志(“ex1”)
道路附加标志(“ex2”)
道路附加标志(“ex3”)
道路附加标志(“ex4”)
道路附加标志(“ex5”)
方框\道路\标志。添加小部件(道路\标志\标签)
方框\道路\标志。添加小部件(道路\标志)
网格添加布局图(1号、1号方框道路标志)
网格。添加布局(框号,2,1)
self.setLayout(网格)
self.show()
def浏览(自我):
w=QtGui.QWidget()
w、 调整大小(320240)
w、 setWindowTitle(“选择图片”)
filename=QtGui.QFileDialog.getOpenFileName(w,‘打开文件’,‘/’)
self.main\u image\u name=文件名
self.main_image.setPixmap(QtGui.QPixmap(self.main_image_name))
def中心(自我):
qr=self.frameGeometry()
cp=QtGui.QDesktopWidget().availableGeometry().center()
qr.移动中心(cp)
self.move(qr.topLeft())
def radio0_已单击(自启用):
如果启用:
打印“0”
self.mode=0
def radio1_已单击(自启用):
如果启用:
打印“1”
self.mode=1
def radio2_已单击(自启用):
如果启用:
打印“2”
自我模式=2
def radio3_已单击(自启用):
如果启用:
打印“3”
自我模式=3
def paintEvent(自身,事件):
????
类menubarex(QtGui.QMainWindow):
def uuu init uuu(self,parent=None):
super(menubarex,self)。\uuuu init\uuuuu(父级)
self.form_widget=示例(self)
self.setCentralWidget(self.form_小部件)
self.initUI()
def initUI(self):
exitAction=QtGui.QAction(QtGui.QIcon('exit.png'),'&exit',self)
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusIP(“退出应用程序”)
exitAction.triggered.connect(QtGui.qApp.quit)
menubar=self.menubar()
fileMenu=menubar.addMenu(“&File”)
fileMenu.addAction(exitAction)
#self.toolbar=self.addToolBar('退出')
#self.toolbar.addAction(exitAction)
self.statusBar().showMessage('Ready')
self.setWindowTitle('mi-ban')
self.setWindowIcon(QtGui.QIcon('icon.png'))
def关闭事件(自身、事件):
reply=QtGui.QMessageBox.question(self,“Message”,
“您确定要退出吗?”,QtGui.QMessageBox.Yes
QtGui.QMessageBox.No)
如果reply==QtGui.QMessageBox.Yes:
event.accept()
其他:
event.ignore()
def main():
app=QtGui.QApplication(sys.argv)
#ex=示例()
menubar=menubarex()
menubar.show()
sys.exit(app.exec_())
main()
您应该编写自己的Qlabel类:
class myQLabel(QLabel):
def __init__(self,parent=None):
super(myQLabel, self).__init__(parent)
def paintEvent(self, QPaintEvent):
super(myQLabel, self).paintEvent(QPaintEvent)
painter = QPainter(self)
painter.setPen(QPen(Qt.red))
painter.drawArc(QRectF(50, 50, 10, 10), 0, 5760)
painter.drawRect(QRectF(50, 50, 100, 100) )
然后使用它:
self.main_image = myQLabel(self)
同时删除示例类中的def paintEvent(self,event)
我使用pyqt5,所以我对代码做了一些修改:
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys, os
class myQLabel(QLabel):
def __init__(self,parent=None):
super(myQLabel, self).__init__(parent)
def paintEvent(self, QPaintEvent):
super(myQLabel, self).paintEvent(QPaintEvent)
painter = QPainter(self)
painter.setPen(QPen(Qt.red))
painter.drawArc(QRectF(50, 50, 10, 10), 0, 5760)
painter.drawRect(QRectF(50, 50, 100, 100) )
class Example(QWidget):
def __init__(self,parent):
super(Example, self).__init__()
self.main_image_name="icons\\add.png"
self.mode = 5
self.initUI()
def initUI(self):
File_name = QLabel('Setup file name')
File_name_edit = QLineEdit()
QToolTip.setFont(QFont('SansSerif', 10))
#QMainWindow.statusBar().showMessage('Ready')
self.setGeometry(300, 300, 250, 150)
self.resize(640, 360)
self.center()
self.main_image = myQLabel(self)
self.main_image.setPixmap(QPixmap(self.main_image_name))
btn = QPushButton("Make setup file")
btn.setToolTip('Press <b>Detect</b> button for detecting objects by your settings')
btn.resize(btn.sizeHint())
btn.clicked.connect(QCoreApplication.instance().quit)
btn_browse = QPushButton("Browse")
btn_browse.clicked.connect(self.browse)
btn_set = QPushButton("Set name")
#fullscreen
#self.main_image.setScaledContents(True)
#just centered
self.main_image.setAlignment(Qt.AlignCenter)
#Layout
box_File_name = QHBoxLayout()
box_File_name.addWidget(File_name)
box_File_name.addWidget(File_name_edit)
box_File_name.addWidget(btn_set)
grid = QGridLayout()
grid.setSpacing(10)
grid.addLayout(box_File_name, 1, 0)
#grid.addWidget(File_name_edit, 1, 1)
grid.addWidget(self.main_image, 2, 0)
grid.addWidget(btn_browse, 3 , 0)
grid.addWidget(btn, 4, 0)
box_number = QVBoxLayout()
number_group=QButtonGroup() # Number group
r0=QRadioButton("Traffic Lights")
number_group.addButton(r0)
r1=QRadioButton("Direction")
number_group.addButton(r1)
r2=QRadioButton("Traffic Lines H")
number_group.addButton(r2)
r3=QRadioButton("Traffic Lines V")
number_group.addButton(r3)
box_number.addWidget(r0)
box_number.addWidget(r1)
box_number.addWidget(r2)
box_number.addWidget(r3)
r0.toggled.connect(self.radio0_clicked)
r1.toggled.connect(self.radio1_clicked)
r2.toggled.connect(self.radio2_clicked)
r3.toggled.connect(self.radio3_clicked)
box_road_sign = QHBoxLayout()
road_sign_label = QLabel('Road signs', self)
road_sign = QComboBox()
road_sign.addItem("None")
road_sign.addItem("ex1")
road_sign.addItem("ex2")
road_sign.addItem("ex3")
road_sign.addItem("ex4")
road_sign.addItem("ex5")
box_road_sign.addWidget(road_sign_label)
box_road_sign.addWidget(road_sign)
grid.addLayout(box_road_sign, 1, 1)
grid.addLayout(box_number, 2, 1)
self.setLayout(grid)
self.show()
def browse(self):
w = QWidget()
w.resize(320, 240)
w.setWindowTitle("Select Picture")
filename = QFileDialog.getOpenFileName(w, 'Open File', '/')
self.main_image_name = filename
self.main_image.setPixmap(QPixmap(self.main_image_name))
def center(self):
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())
def radio0_clicked(self, enabled):
if enabled:
print("0")
self.mode=0
def radio1_clicked(self, enabled):
if enabled:
print("1")
self.mode=1
def radio2_clicked(self, enabled):
if enabled:
print("2")
self.mode=2
def radio3_clicked(self, enabled):
if enabled:
print("3")
self.mode=3
# def paintEvent( self, event) :
# pass
class menubarex(QMainWindow):
def __init__(self, parent=None):
super(menubarex, self).__init__(parent)
self.form_widget = Example(self)
self.setCentralWidget(self.form_widget)
self.initUI()
def initUI(self):
exitAction = QAction(QIcon('exit.png'), '&Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')
exitAction.triggered.connect(qApp.quit)
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAction)
#self.toolbar = self.addToolBar('Exit')
#self.toolbar.addAction(exitAction)
self.statusBar().showMessage('Ready')
self.setWindowTitle('mi ban')
self.setWindowIcon(QIcon('icon.png'))
def closeEvent(self, event):
reply = QMessageBox.question(self, 'Message',
"Are you sure to quit?", QMessageBox.Yes |
QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
def main():
app = QApplication(sys.argv)
#ex = Example()
menubar = menubarex()
menubar.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
从PyQt5.QtGui导入*
从PyQt5.QtCore导入*
从PyQt5.QtWidgets导入*
导入系统,操作系统
类myQLabel(QLabel):
def uuu init uuu(self,parent=None):
super(myQLabel,self)。\uuuu init\uuuu(父级)
def paintEvent(自我、QPaintEvent):
超级(myQLabel,self).paintEvent(QPaintEvent)
油漆工=油漆工(自身)
油漆工设置笔(QPen(Qt.红色))
绘制弧(QRectF(50,50,10,10),05760)
画家drawRect(QRectF(50,50,100,100))
类示例(QWidget):
定义初始化(自身,父级):
super(例如,self)。\uuuuu init\uuuuuuuu()
self.main\u image\u name=“图标\