最近项目需要,简单的写起了一个界面,装了一个pyqt5.1,以下记录一下。
我主要使用的功能是Qlabel,它不但可以显示文字,还可以显示图片。但是它自身是没有鼠标监听功能的,所以我自己重新封装了一层。
首先是引用部分,我引用了一大堆,反正都有用,我还没有完全摸清楚,将来再补充
#coding:utf-8 from PyQt5.QtWidgets import QApplication, QLabel, QSlider from PyQt5 import QtWidgets import PyQt5.QtCore from PyQt5.QtCore import Qt from PyQt5.QtGui import QPixmap, QImage from PyQt5.QtWidgets import *
以下是我封装的Qlabel类,因为带有按键监听功能,所以我改名叫button label了
class BtnLabel(QLabel):
def __init__(self,parent=None):
super(BtnLabel,self).__init__(parent)
self.if_mouse_press = False
def mouseMoveEvent(self,e):
print ('mouse move:(%d,%d)\n'%(e.pos().x(),e.pos().y()))
if self.if_mouse_press:
dialog.move_point(e.pos().x(),e.pos().y())
def mousePressEvent(self,e):
print ('mousePressEvent(%d,%d)\n'%(e.pos().x(),e.pos().y()))
self.if_mouse_press = True
dialog.move_point(e.pos().x(),e.pos().y())
def mouseReleaseEvent(self,e):
print ('mouseReleaseEvent(%d,%d)\n'%(e.pos().x(),e.pos().y()))
self.if_mouse_press = False
可以看到,我加了鼠标移动,鼠标点击,鼠标释放三个功能,但是它的鼠标点击是个事件,不是一个状态,所以我要想实现鼠标拖动效果得自己添加一个状态,也就是self.if_mouse_press这个家伙,当点击的时候为true,松开的时候为false,这样就可以判断移动的时候是不是点击状态了。
然后我需要点击的时候能够干一个事情,执行这个move_point函数,但是呢这个函数在创建窗口的那个类里面,我暂时想不到什么好办法,只好把窗口对象dialog写成全局变量了,这绝对不是一个好办法,日后我找到更好的办法了会专门讲解一下的。
然后就是dialog的那个类,也就是主窗口的类
class MainDialog(QDialog):
def __init__(self,parent=None):
super(MainDialog,self).__init__(parent)
self.input_label = BtnLabel(self)
self.input_label.setGeometry(160, 40, 640, 480)
self.output_label = BtnLabel(self)
self.output_label.setGeometry(900, 40, 640, 480)
#set open file button
self.open_btn = QtWidgets.QPushButton(self)
self.open_btn.setObjectName("open_btn")
self.open_btn.setGeometry(1, 0, 100, 40)
self.open_btn.setText("open")
self.open_btn.clicked.connect(self.open_file)
#set calculate button
self.calc_btn = QtWidgets.QPushButton(self)
self.calc_btn.setObjectName("calc_btn")
self.calc_btn.setGeometry(1, 60, 100, 40)
self.calc_btn.setText("calculate")
self.calc_btn.clicked.connect(self.calculate)
#set save file button
self.save_btn = QtWidgets.QPushButton(self)
self.save_btn.setObjectName("save_btn")
self.save_btn.setGeometry(1, 120, 100, 40)
self.save_btn.setText("save")
self.save_btn.clicked.connect(self.save_file)
#set add point button
self.add_point_btn = QtWidgets.QPushButton(self)
self.add_point_btn.setObjectName("add_point_btn")
self.add_point_btn.setGeometry(1, 180, 100, 40)
self.add_point_btn.setText("add point")
self.add_point_btn.clicked.connect(self.add_point_on_click)
#set erase point button
self.erase_point_btn = QtWidgets.QPushButton(self)
self.erase_point_btn.setObjectName("erase_point_btn")
self.erase_point_btn.setGeometry(1, 240, 100, 40)
self.erase_point_btn.setText("erase point")
self.erase_point_btn.clicked.connect(self.erase_point_on_click)
#set add border button
self.add_border_btn = QtWidgets.QPushButton(self)
self.add_border_btn.setObjectName("add_border_btn")
self.add_border_btn.setGeometry(1, 300, 100, 40)
self.add_border_btn.setText("add border")
self.add_border_btn.clicked.connect(self.add_border_on_click)
#set result text
self.text_label = QLabel(self)
self.text_label.setAlignment(Qt.AlignCenter)
self.text_label.setGeometry(1, 360, 140, 100)
这里面我定义了两个btnlabel放图片,一个qlabel放文字,还有6个按钮,先从qlabel讲起吧。
self.text_label = QLabel(self)
self.text_label.setAlignment(Qt.AlignCenter)
self.text_label.setGeometry(1, 360, 140, 100)
第一句就是创建一个QLabel的对象,第二句是设置里面文本的对齐方式,为居中,第三句是设置坐标以及尺寸,这个setGeometry函数有4个参数,分别是起始点也就是左上角的x,y然后是宽度和高度,那些button其实也用了这个函数
想要在里面写字的话就用self.text_label.setText('abc')这个函数,但是注意框的大小不会随着文字长度而变化,如果文字过长就会看不见了,至于具体怎么调节我以后再仔细研究。
button的创建和qlabel的创建大同小异,唯一区别的就是button有绑定点击响应的函数,
self.add_point_btn.setObjectName("add_point_btn")
使用这句就把add_point_btn这个按钮绑定了add_point_btn这个函数了,一旦点击这个按钮就执行这个函数,具体想干什么就随意啦。我是让他点击这个按钮可以在我的两个qlabel上面画画

我的最终效果是这样的,下一节我将讲解如何用opencv的mat显示上来


