Python:如何在PyQt中在图像上绘制对象

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

我应用GridLabel定位对象。我在一间牢房里发现了灰色的图像。现在我只想在这个灰色单元格上画矩形。但它只能在这张灰色的照片下移动,也会从这个细胞的边界向外移动。我需要如何编写这部分代码,让我在这个灰色的图像上画画,并且不从它的边界中走出来

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=“图标\