我的项目特别庞大,所以只在这里粘所需代码,需要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_())