用PyQt做点实用工具
现在在做一个用PyQt结合openCV的智能剪切小工具。
这篇博客涉及的知识点包括:
PyQt设计gui的基本流程。
Opencv边缘检测
使用配置文件保存变量
目前已经实现了剪切功能。界面如下:
PyQt制作GUI的基本流程(以我设计这个小工具为例):
1,首先导入需要的相关模块,PyQt。
2,先定义一个主类,这个主类中的所封装的所有内容通过show函数显示。
初始化变量,顾名思义就是一运行代码就会首先处理的一些事件,不需要任何触发,所以这里面不应该存放一些经常改变的具体变量。
class MainCrop(QMainWindow):
def __init__(self,parent =None):
QMainWindow.__init__(self,parent)
self.setWindowTitle(u'欢迎使用智能剪切板')
self.resize(580,388)
self.picture =Qlabel() #这个初始化一个基,主要看你来做什么,如果做文字编辑器,就应该是QTextEdit。我要做的是用Qlabel显示图片。
self.initUi这段代码是初始化变量。
在PyQt中,所以class都是从QObject派生而来,QWidget对象就可以有一个parent。这种parent-child关系主要用于两个方面:
- =没有parent的QWidget类被认为是最上层的窗体(通常是MainWindow),由于MainWindow的一些操作生成的新窗体对象,parent都应该指向MainWindow。
- 由于parent-child关系的存在,它保证了child窗体在主窗体被回收之时也被回收。
parent作为构造函数的最后一个参数被传入,但通常情况下不必显示去指定parent对象。因为当调用局管理器时,部局管理器会自动处理这种parent-child关系。但是在一些特殊的情况下,我们必须显示的指定parent-child关系。如当生成的子类不是QWidget对象但继承了QObject对象,用作dock widgets的QWidget对象。
我们可以看到,对象之间有了依赖和生命周期,把IOC容器运用到GUI编程中是自然而然的事情了。(http://blog.youkuaiyun.com/thumb3344/article/details/5644789)
初始化的部分其实到这里完成了它的使命,后来再需要一些变量可以在添加。
3,接下来初始化窗体,和初始化变量不同的是,这里要添加一些关于菜单栏,状态栏等相关操作。
def initUi(self):
self.setWindowIcon(QtGui.QIcon('images/crop.png'))
#================右键菜单
self.contextMenu = QMenu(self)
self.contextMenu.addAction(self.OpenAction)
#===============菜单,工具栏
self.createMenuBars()
self.createToolBars()
如何就是一些触发机制了,PyQt中称为信号与槽。就是点击通俗一点来讲就是通过点击这个命令,触发一些动作。比如,打开,保存,编辑...
4,为了可视化,我们将这些命令放在不同的菜单当中。
下面介绍菜单和工具栏,右键命令。
菜单栏:
def createMenuBars(self):
file =self.menuBar().addMenu(u'文件')
file.addAction(self.OpenAction)
工具栏:
def createToolBars(self):
self.toolBar = self.addToolBar("")
self.toolBar.addAction(self.OpenAction)
右键:
self.contextMenu = QMenu(self)
self.contextMenu.addAction(self.OpenAction)
5,不难发现,我这里是通过addAction来建立菜单与事件的联系的。因为我这里的信号是各个菜单,所以通过这种方式比较方便。如果是一个实例按钮,可以通过connect函数。
self.connect(self.button, QtCore.SIGNAL("clicked()"),
QtGui.qApp, QtCore.SLOT("quit()"))
addAction就是添加这个菜单的显示,快捷键,触发事件等一系列组合在一起的事件。
我通过一个例子来理解这个事件。
上面有一个事件:
self.OpenAction
要构造OpenAction这个函数:
self.OpenAction = QAction(QtGui.QIcon('images/open.png'), u"&打开...",
self, shortcut=QtGui.QKeySequence.Open,
statusTip=u"打开文件",triggered=self.openFileEvent)
这里面包括了菜单实例的图标,显示的标识,快捷键,会自带一些常用的快捷键,比如open,cut,save。这时只需要调用相应的内部函数:QtGui.QKeySequence.Open
如果不是常用的快捷键,自己也可以设置。
shortcut="Ctrl+A"
状态提示信息,如果没有添加菜单栏这个显示信息会显示在鼠标悬浮的位置,如果添加状态栏,
状态栏也会显示该信息,最后一个是触发事件,是一个自己构造的函数,也有些是自带的函数。比如,关闭窗口事件,self.close。
这个函数是不需要例外构造的。
其他的都是一些重复的代码,添加不同的菜单,对应不同的事件。
6,最后添加以下代码。
app =QApplication(sys.argv)
ui = MainCrop()
ui.show()
app.exec_()
每个Qt必须有一个app, QApplication包含一个主循环, 并处理从窗口系统进来事件。QWidget如果没有指定父,
那么它就是顶级窗口