Pyqt4 在label上显示图片,用鼠标选点并用QPainter画出来

我的项目特别庞大,所以只在这里粘所需代码,需要opencv2,pyqt4,然后把所以类放到一个py文件就能运行。

如果有疑问或者想和我讨论的可以发私信给我。QAQ

一:创建一个QtGui.QLabel的子类,在子类里重写painEvent方法,为了显示图片,调用父类的painEvent方法,然后定义一个QPainter(),画点:

def paintEvent(self, e):
    QtGui.QLabel.paintEvent(self, e) #调用父类的painEvent方法
    qp = QtGui.QPainter()
    qp.begin(self)
    if self.pixel_x > 0 and self.pixel_y > 0:
        self.drawPoints(qp)
    qp.end()

def drawPoints(self, qp):
    qp.setPen(QtGui.QPen(QtCore.Qt.red, 5)) #里面的5是你画的点大小,可以自己设置
    qp.drawPoint(self.pixel_x, self.pixel_y)

为了能让鼠标选点,得重写mousePressEvent方法:

def mousePressEvent(self, e):
    str = "(" + QtCore.QString.number(e.x()) + "," + QtCore.QString.number(e.y()) + ")"
    if e.button() == QtCore.Qt.LeftButton:
        print (self.tr("Mouse Left Button Pressed:") + str)
    elif e.button() == QtCore.Qt.RightButton:
        print (self.tr("Mouse Right Button Pressed:") + str) #self.sBar.showMessage
    elif e.button() == QtCore.Qt.MidButton:
        print (self.tr("Mouse Middle Button Pressed:") + str)
    self.pixel_x = e.x()
    self.pixel_y = e.y()

完整的QLabel子类如下:

class MyLabel(QtGui.QLabel):
    def __init__(self, parent=None):
        super(MyLabel, self).__init__(parent)
        self.pixel_x = -1  # pixel coordinate
        self.pixel_y = -1
        self.setAlignment(QtCore.Qt.AlignTop)

    def paintEvent(self, e):
        QtGui.QLabel.paintEvent(self, e)
        qp = QtGui.QPainter()
        qp.begin(self)
        if self.pixel_x > 0 and self.pixel_y > 0:
            self.drawPoints(qp)
        qp.end()

    def drawPoints(self, qp):
        qp.setPen(QtGui.QPen(QtCore.Qt.red, 5))
        qp.drawPoint(self.pixel_x, self.pixel_y)

    # def mouseMoveEvent(self, e):
    #     self.setText("(" + QtCore.QString.number(e.x()) + "," + QtCore.QString.number(e.y()) + ")")

    def mousePressEvent(self, e):
        # str = "(" + QtCore.QString.number(e.x()) + "," + QtCore.QString.number(e.y()) + ")"
        # if e.button() == QtCore.Qt.LeftButton:
        #     self.setText(self.tr("Mouse Left Button Pressed:") + str)
        # elif e.button() == QtCore.Qt.RightButton:
        #     self.setText(self.tr("Mouse Right Button Pressed:") + str) #self.sBar.showMessage
        # elif e.button() == QtCore.Qt.MidButton:
        #     self.setText(self.tr("Mouse Middle Button Pressed:") + str)
        self.clear()
        self.pixel_x = e.x()
        self.pixel_y = e.y()

 

二:在Ui_MainWindow中声明一个MyLabel

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(862, 594)
        MainWindow.setToolButtonStyle(QtCore.Qt.ToolButtonFollowStyle)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        #self.label =QtGui.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(170, 40, 640, 480))
        self.label.setObjectName("label")

三:在MainWindow中用label显示图片

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.setupUi(self)
        img = cv2.imread("alpha.png")
        # Convert to RGB for QImage.
        cv2.cvtColor(img, cv.CV_BGR2RGB, img)
        showImage = QImage(img.data, 640, 480, QImage.Format_RGB888)
        self.label.setPixmap(QPixmap.fromImage(showImage))

 

运行:

 

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    MainWindow = MainWindow()
    MainWindow.show()
    sys.exit(app.exec_())
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值