maya python教程pythoncuiPyQt是和Qt的绑定我们知道在中有_第1页
maya python教程pythoncuiPyQt是和Qt的绑定我们知道在中有_第2页
maya python教程pythoncuiPyQt是和Qt的绑定我们知道在中有_第3页
maya python教程pythoncuiPyQt是和Qt的绑定我们知道在中有_第4页
maya python教程pythoncuiPyQt是和Qt的绑定我们知道在中有_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PyQt学习笔记(1)(2010-02-20 09:24:45)o worldPyQt是和Qt的绑定。知道,在中有很多GUI的库,比如自带的,PyGTK,PyQt等等,其中PyQt是Tker,还有些更加强大的外部库,比如wx基于Qt的一个GUI库,可以用于快速开发。Qt是很高级的,它的库提供了很多已经设计好了的屏幕对象,控件,和很多的类,由于Qt是用C+写的,而且是跨语言的简单而具有了和面的优势。象的,PyQt不仅继承了这些优点,还因为的在Qt中,由最原始的基类Qobject,Qwidget继承于Qobject,代表了所有窗口控件,是所有窗口控件的父类,比如Qlabel,Qdialog等等。关

2、于PyQt的版本现在一般用的是PyQt4,这个版本是基于Qt的版本而变化和开发的。按照惯例,先来个PyQt版的#! /usr/bin/env #coding=utf-8o World程序:import sysfrom PyQt4.QtGui import *app = QApplication(sys.argv)button = QPushButton( button.show() app.exec_()运行结果如下:o World!)和Tk以及Wx差不多,也是先创建一个应用,然后再是消息循环,直到终止,其中的创建控件(按钮)和显示和其它GUI类似,最后的app.exec_()是消息循环。源文

3、档PyQt学习笔记(2)Dumb Dialogs(2010-02-20 09:28:02)框在GUI编程中是比较重要的控件,这里按照框的“智能”水平,把框分为”Dumb Dialogs,Standard Dialogs,Smart Dialogs”三种。首先是Dumb Dialogs。也就是比较傻瓜式的框,看一个例子:要设计一个简单的字体设置框,要求可选择字体,和设置字体大小。程序如下:font.py#!/usr/bin/env #coding=utf-8import sysfrom PyQt4.QtCore import * from PyQt4.QtGui import *class Fo

4、ntPropertiesDlg(QDialog): #初始化def init (self, parent=None):#super函数完成框的初始化super(FontPropertiesDlg, self). init (parent) FontStyleLabel = QLabel(u中文字体:)分区 未归档笔记 的第 1 页boBox = QComboBox()boBox.addItems(u宋体, u黑体, u仿宋,u隶书, u楷体) FontSizeLabel = QLabel(u字体大小) FontSizeSpinBox = QSpinBox() FontSizeSpinBox.s

5、etRange(0, 90)FontEffectCheckBox =QCheckBox(u使用特效) okButton = QPushButton(u确定) cancelButton = QPushButton(u取消)#确定控件的布局buttonLayout = QHBoxLayout() buttonLayout.addStretch() buttonLayout.addWidget(okButton) buttonLayout.addWidget(cancelButton) layout = QGridLayout() layout.addWidget(FontStyleLabel, 0

6、, 0)layout.addWidget(boBox, 0, 1)layout.addWidget(FontSizeLabel, 1, 0)layout.addWidget(FontSizeSpinBox, 1, 1)layout.addWidget(FontEffectCheckBox,1,2)layout.addLayout(buttonLayout, 2, 0,1,3) self.setLayout(layout)#窗口的标题self.setWindowTitle(u字体)app = QApplication(sys.argv) font= FontPropertiesDlg() fon

7、t.show()app.exec_()结果如下:程序的内容就是创建一个框的窗体,其中创建了一些控件,然后通过layout方法来在窗体上布局这些控件,最后是创建应用和消息循环。下面看看layout是如何布局的。这里用到了两个layout一个是buttonlayout,一个layout,其中的buttonlayout是放到了layout上。buttonLayout = QHBoxLayout() buttonLayout.addStretch()buttonLayout.addWidget(okButton) buttonLayout.addWidget(cancelButton)button是水

8、平放置的,QHBoxLayout,而且用到了Stretch,也就是说这里的确定和取消按钮虽然是水平放置的,但是由于stretch的作用,两个按钮会靠右放置,而且随着窗口大小的改变,也是靠右边的,如上图。(如果把上面第二句去掉的话,两个按钮的显示就变了,左右平局分布)。源文档PyQt学习笔记(3)Standard Dialogs(2010-02-20 09:32:03)一般的标准单,框是什么样子的呢?还是以word里的字体设置为例。一般都是通过菜,按钮等的响应而创建的框,而且框分为模态(modal)和非模态(modalless),对于标准框,当用户按下确定按钮,框,并且主窗口得到分区 未归档笔记

9、 的第 2 页了用户确认的信息(设置的字体),按取消按钮,框,没有别的改变。首先看一个modal框的例子:用户点击按钮,弹出字体设置框,用户点击确定,显示用户的选择,关闭窗口。 #!/usr/bin/env #coding=utf-8import sysfrom PyQt4.QtCore import * from PyQt4.QtGui import *class FontPropertiesDlg(QDialog):def init (self,parent=None): super(FontPropertiesDlg, self). init (parent) FontStyleLabe

10、l = QLabel(u中文字体:)boBox = QComboBox()boBox.addItems(u宋体,u黑体,u隶书, u楷体)self.FontEffectCheckBox =QCheckBox(u使用特效) FontSizeLabel = QLabel(u字体大小) self.FontSizeSpinBox = QSpinBox() self.FontSizeSpinBox.setRange(1, 90)okButton = QPushButton(u确定) cancelButton = QPushButton(u取消)u仿宋,buttonLayout = QHBoxLayout

11、() buttonLayout.addStretch() buttonLayout.addWidget(okButton) buttonLayout.addWidget(cancelButton) layout = QGridLayout() layout.addWidget(FontStyleLabel, 0, 0)layout.addWidget(boBox, 0, 1)layout.addWidget(FontSizeLabel, 1, 0)layout.addWidget(self.FontSizeSpinBox, 1, 1) layout.addWidget(self.FontEff

12、ectCheckBox,1,2) layout.addLayout(buttonLayout, 2, 0) self.setLayout(layout)self.connect(okButton,SIGNAL(clicked(),self,SLOT(accept()self.connect(cancelButton,SIGNAL(clicked(),self,SLOT(reject t()self.setWindowTitle(u字体)class Malog(QDialog):def init (self,parent=None):super(Malog,self). init (parent

13、)self.FontPropertiesDlg=Noneself.format=dict(fontstyle=u”宋体”,fontsize= 1,fonteffect=False)FontButton1 = QPushButton(u设置字体(模态) FontButton2 = QPushButton(u设置字体(非模态) self.label = QLabel(u默认选择)layout = QGridLayout() layout.addWidget(FontButton1,0,0) layout.addWidget(FontButton2,0,1) layout.addWidget(sel

14、f.label) self.setLayout(layout)self.connect(FontButton1,SIGNAL(clicked(),self.FontModalDialog)分区 未归档笔记 的第 3 页self.connect(FontButton2,SIGNAL(clicked(),self.FontModalessDialog)self.setWindowTitle(u模态和非模态 self.updataData()框)def updataData(self):self.label.setText(u选择的字体:%s字体大小:%d是否特效:%s%(self.formatfo

15、ntstyle,self.formatfontsize,self.formatfon teffect)def FontModalDialog(self):dialog = FontPropertiesDlg(self) if dialog.exec_():self.formatfontstyle =unicode(dboBox.currentText()self.formatfontsize =dialog.FontSizeSpinBox.value()self.formatfonteffect =dialog.FontEffectCheckBox.isChecked()self.updata

16、Data()def FontModalessDialog(self): passapp = QApplication(sys.argv)font= Ma font.show() app.exec_()结果如下:log()其中右边的的内容。框是弹出的模态框,通过设置,确定以后可以在主框上显示出更新其中“设置字体(非模态)“函数没有完成功能。在模态框里面,是调用了dialog的exec_()函数,它能产生并显示框,并进入消息循环,此时就不能和主窗口进行交互了,只能点击确定或者取消,关闭此模态才能继续。框源文档PyQt学习笔记(4)Smart Dialogs(2010-02-20 09:34:34)

17、这里的smart dialogs 一般都是指的非模态框,就是用户想要实时的看到自己的操作对主窗口的影响,当然在某些模态框中,添加预览功能可以实现上面的需求,但是这些在非模态框中是很容易做到的。面模态先写一个类,M #!/usr/bin/env #coding=utf-8框的字体选择程序基础上加以修改。essDialog.py,如下:from PyQt4.QtCoreimport *from PyQt4.QtGui import *分区 未归档笔记 的第 4 页class FontPropertiesDlg(QDialog):def init (self,format,parent=None):

18、 super(FontPropertiesDlg, self). init (parent) self.format=formatFontStyleLabel = QLabel(u中文字体:)boBox = QComboBox() boBox.addItems(u宋体, u黑体,u隶书, u楷体) self.FontEffectCheckBox =QCheckBox(u使用特效) FontSizeLabel = QLabel(u字体大小) self.FontSizeSpinBox = QSpinBox() self.FontSizeSpinBox.setRange(1, 90) applyBu

19、tton = QPushButton(u应用) cancelButton = QPushButton(u取消)u仿宋,buttonLayout = QHBoxLayout() buttonLayout.addStretch() buttonLayout.addWidget(applyButton) buttonLayout.addWidget(cancelButton) layout = QGridLayout() layout.addWidget(FontStyleLabel, 0, 0)layout.addWidget(boBox, 0, 1)layout.addWidget(FontSi

20、zeLabel, 1, 0)layout.addWidget(self.FontSizeSpinBox, 1, 1) layout.addWidget(self.FontEffectCheckBox,1,2) layout.addLayout(buttonLayout, 2, 0) self.setLayout(layout)self.connect(applyButton,SIGNAL(clicked(),self.apply) self.connect(cancelButton,SIGNAL(clicked(),self,SLOT(reject()self.setWindowTitle(u

21、字体)def apply(self): self.formatfontstyle =unicode(boBox.currentText()self.formatfontsize = self.FontSizeSpinBox.value() self.formatfonteffect = self.FontEffectCheckBox.isChecked() self.emit(SIGNAL(changed)然后在上一个模态框程序中添加:Import M然后添加函数essDialogdef FontModalessDialog(self):dialog = MessDialog.FontProp

22、ertiesDlg(self.format,self)self.connect(dialog,SIGNAL(changed),self.updataData) dialog.show()即可。结果如下:只要点击应用,左边主地方:框立刻更新用户选择。也可以看到程序中两个最重要的1:self.emit(SIGNAL(changed)分区 未归档笔记 的第 5 页2:self.connect(dialog,SIGNAL(changed),self.updataData)可以看到只要用户点击“应用”,后程序发现填出框内容发生改变,则立刻产生消息”changed”,主程序消息循环得到这个消息,立刻运行u

23、pdataData,所以主窗口更新了内容。下面再看一种比上面非模态框更方便快速的方法,就是没有按钮,只要改变了框的内容,结果就立马显示。称这种框为”live dialog”。首先还是先写一个类,单独一个py文件:LiveDialog.py #!/usr/bin/env#coding=utf-8import sysfrom PyQt4.QtCore import * from PyQt4.QtGui import *class FontPropertiesDlg(QDialog):def init (self,format,callback,parent=None): super(FontPro

24、pertiesDlg, self). init (parent)self.format = formatself.callback = callbackFontStyleLabel = QLabel(u中文字体:)boBox = QComboBox() boBox.addItems(u宋体, u黑体,u隶书, u楷体) self.FontEffectCheckBox =QCheckBox(u使用特效) FontSizeLabel = QLabel(u字体大小) self.FontSizeSpinBox = QSpinBox() self.FontSizeSpinBox.setRange(1,

25、90)u仿宋,layout = QGridLayout() layout.addWidget(FontStyleLabel, 0, 0)layout.addWidget(boBox, 0, 1)layout.addWidget(FontSizeLabel, 1, 0)layout.addWidget(self.FontSizeSpinBox, 1, 1) layout.addWidget(self.FontEffectCheckBox,1,2) self.setLayout(layout)self.connect( ly)boBox,SIGNAL(itemSelected),self.apps

26、elf.connect(self.FontEffectCheckBox,SIGNAL(toggled(bool), self.apply)self.connect(self.FontSizeSpinBox,SIGNAL(valueChanged( self.apply)self.setWindowTitle(u字体),def apply(self):self.formatfontstyle =unicode(boBox.currentText()self.formatfontsize = self.FontSizeSpinBox.value() self.formatfonteffect =

27、self.FontEffectCheckBox.isChecked() self.callback()然后在font.py中添加: import LiveDialog 在类的init中添加:分区 未归档笔记 的第 6 页self.FontPropertiesDlg=None然后添加方法:def FontLiveDialog(self):if self.FontPropertiesDlg is None: self.FontPropertiesDlg =LiveDialog.FontPropertiesDlg(self.format,self.updataData,self) self.Font

28、PropertiesDlg.show() self.FontPropertiesDlg.raise_() self.FontPropertiesDlg.activateWindow()运行就可以实时改变用户的选择了。源文档PyQt学习笔记(5)Mian Window(2010-02-20 09:37:46)主窗口(MianWindow)一般是应用程序的框架,在主窗口上可以添们需要的widget,添加菜单, # MianWindow.py #!/usr/bin/env #coding=utf-8,状态栏等等。下面看看在PyQt中如何建立主窗口。import sysfrom PyQt4.QtCor

29、e import * from PyQt4.QtGui import *class MainWindow(QMainWindow):def init (self,parent=None): super(MainWindow,self). init (parent)self.sus = self.susBar()self.sus.showMessage(This is SusBar,5000) self.setWindowTitle(PyQt MianWindow)def main():app = QApplication(sys.argv)app.setWindowIcon(QIcon(./i

30、mages/ form = MainWindow() form.show()app.exec_()main()上面是一个简单的产生MainWindow的例子:在窗口类中,初始化同样是由super完成的,然后示窗口,非常简单。命名了窗口的标题。最后消息循环显状态栏可以直接由susBar()产生,showMessage()来显示消息。下面看看一个典型的应用程序框架窗口的布局和组成:分区 未归档笔记 的第 7 页可以看到,布局一个框架窗口是一个系统工程,需要多方面的内容。后面会慢慢学习。源文档PyQt学习笔记(6)Actions and Key Sequen(2010-02-20 09:40:24)

31、在Qt中,目前我认为做的最好的两种机制就是:SIGNAL and SLOTS和Actions and Key Sequen。Actions and Key Sequence我对他的理解就是各种动作带来的子:一致反应。举个例比如在应用程序中常见的“新建文件”这能,他的实现可以通过下面几种方式:1 点击菜单:File-New菜单项2 点击:new的图标3 键盘快捷方式:如Ctrl+N上面的这三种actions,其实带来的结果(Sequence)是一样的,就是新建文件,那么在程序中如何做到三者的和同步,Qt给了很好的解决方法。在PyQt中,它把类似上面的actions封装(encapsulates)

32、到一个Qaction的class中,下面举个例子:(windows环境下)#!/usr/bin/env #coding=utf-8import sysfrom PyQt4.QtCore import * from PyQt4.QtGui import *class MainWindow(QMainWindow):def init (self,parent=None): super(MainWindow,self). init (parent)fileNewAction=QAction(QIcon(./images/filenew.png),&New,self)fileNewAction.set

33、Shortcut(QKeySequence.New) helpText = Create a new file fileNewAction.setToolTip(helpText) fileNewAction.setSusTip(helpText)分区 未归档笔记 的第 8 页self.connect(fileNewAction,SIGNAL(triggered(),self.fileNew)self.file self.file= self.Bar().add(&File).addAction(fileNewAction)filetoolbar= self.addToolBar(File)f

34、iletoolbar.addAction(fileNewAction)self.sus = self.susBar()self.sus.showMessage(This is SusBar,5000)self.setWindowTitle(PyQt MianWindow)def fileNew(self):self.sus.showMessage(You have created a new file!,9000)def main():app = QApplication(sys.argv) app.setApplicationName(PyQt MianWindow)app.setWindo

35、wIcon(QIcon(./images/ form = MainWindow()form.show() app.exec_()main()上面程序的目的就是:要让点击菜单new,Ctrl+N,点击行一个命令fileNew()。new按钮三种action都执其中红色部分就是Qaction部分,其中的QKeySequence.New 就是基本多都使用的新建的响应快捷键Ctrl+N,如果需要的快捷键没有,那么可以自己设置,就是填写快捷键的名称比如:fileNewAction.setShortcut(“Ctrl+N”)。把这个action都给了菜单new和,通过connect绑定,他们都执行同一响应

36、。从上面可以看到,每次创建一个QAction都需要五六行,如果在一个应用程序中都这么创建会很费时间的,所以可以写一个函数来封装这能:def createAction(self,text,slot=None,shortcut=None, icon=None, icon=None,tip=None,checkable=False,signal=triggered(): action = QAction(text, self)if icon is not None: action.setIcon(QIcon(./images/%s.png % icon)ifshortcut is not None:

37、 action.setShortcut(shortcut)tip is not None: action.setToolTip(tip) action.setSusTip(tip)slot is not None:self.connect(action, SIGNAL(signal), slot) checkable:ifififaction.setCheckable(True)return action有了这个函数以后,可以定义上面的fileNewAction了:fileNewAction = self.createAction(&New., self.fileNew,QKeySequenc

38、e.New, filenew, Create an imagefile)一句话搞定。QKeySequence.New也可以用”Ctrl+n”代替源文档PyQt学习笔记(7)Qt Designer(1)(2010-02-20 12:13:33)用Qt Designer设计一个框。假如想设计一个下面的框:分区 未归档笔记 的第 9 页一,创建工程打开Designer,在弹出的新建窗体框中,选择templatesforms中的DialogwithButtonBottom,点击创建,就会创建一个如下图所示的框。如图然后得到了一个带有按钮的框,选定两个按钮,然后点击右键,删除这两个按钮,自己设置。这个f

39、orm就变空了,以便接下来二,放置widgets和buttons等在Qt Designer窗口左边有一个widget box,里面有很多图标代表了一些widget,在Display Widget里面找到Label控件,然后把它拖到的窗体form中,放到左上角,选中它,然后在Qt Designer窗口右边的属性编辑器中找到“Text”属性,然后把它的值改为“Find &what”,如下图:分区 未归档笔记 的第 10 页然后再从widget box中的input widgets中找到Line Edit ,把它拖到框中Label的右边,对齐。然后在属性编辑器找到ObjectName属性,把值改为f

40、indLineEdit。为什么上面的LableName不改呢?因为不会在程序中用到它,这里改了LineEdit的Name是因为在程序中会用到这个值。然后,在拖一个Label和一个LineEdit分别放到上面的两个widget下面,其中Label的text属性改为“Replace with”,而Line Edit的ObjectName改为replaceLineEdit。结果应该如下图所示:分区 未归档笔记 的第 11 页先把上面的保存为:findandreplacedlg.ui下面,在上面的基础上增加两个checkboxs,从widget box中的Buttons中找到CheckBox,然后拖两

41、个到框中,放到label和line edit的下面。把第一个check box的ObjectName改为caseCheckBox,把它的Text属性值改为&Case sensitive;把第二个 check box的ObjectName改为wholCheckBox,Text属性改为Wh&ole words,并且把 “checked”状态改为“true”。此时 框如下所示:下面,在上面基础上添加一个和一个boBox。其中的Label放到第一个check box的下面,它的属性改为。然后拖一个boBox放到这个Label的右边,它的要给这个ComboBox添加两个Items。方法Objectnam

42、e设为“syntax ComboBox”。然后是:选中这个ComboBox,点击右键,在弹出的菜单中选第一项Edit Items,然后在弹出的框中点击图标“+”,添加一项Item,并把内容改为“Literal text”,然后再同样的方法添加一项“Regular expres_r”。如下图所示:分区 未归档笔记 的第 12 页下面就要在dialog的右边创建button了,在创建之前。还需要向窗口添加两个东西。首先添加一个Vertical Spacer(在widget box中的Spacers group中),它的作用是当 dialog的大小改变时,窗口里的widgets不会布局发生散化或者变

43、乱。第二个需要添加的是 Vertical Line(在widget box中的Display widgets中),把它放到两个LineEdit的右边,用于分割这些widgets和即将添加的buttons。如下图所示:下面开始创建button。从Button group中拖一个Push Button到窗口中,放到右上位置,把它的ObjectName改为“findButton”,它的text改为“&Find”。再拖个一个push button放到这个find的下面,ObjectName改为“replaceButton”, text改为“&Replace”。创建第三个button在replace b

44、utton的下面,ObjectName改为“replaceAllButton”, text改为“Replace &All”。然后拖一个Vertical spacer放到下面。最后创建第四个button,ObjectName改为“closeButton”,text改为“Close”。现在所有的widgets和button都创建完了,如下图所示:分区 未归档笔记 的第 13 页参考资料RaGUI Programing with PyQtchapter 7源文档PyQt学习笔记(8)Qt Designer(2)(2010-02-20 12:22:13)三,完成窗口的布局Layout关于窗口的布局,不

45、同人可能有不同的喜好,下面简单的演示一下。首先,把Find what和replace With的两个Label和两个Line Edit布局到一起,按住shift键,鼠标选中这四个widgets。然后点击菜单Form-Lay Out in a Grid项(或者点击toolbar button),四个widgets会用红线圈起来,当然这些红线在程序运行时是不会显示的。然后选择两个CheckBox,点击菜单Form-Lay Out Horizontally,水平布局。同样也把下面的一个和boBox设为水平布局。如上所示,现在已经有三个layout了,一个格型布局,两个水平布局。下面把这三个布局放到一

46、个布局里面,通过鼠标拖拽来选定三个layout,只要覆盖到layout就行,注意不要接触来Vertical Line,但是要接触到Vertical spacer,选中以后,点击菜单Form-Lay Out Vertically。然后用同样的方法,拖拽选中右边的四个button和一个Vertical spacer,选中以后,点击菜单Form-Lay Out Vertically。最终有了两个垂直的layouts,和中间一个Vertical Line,如下图所示:分区 未归档笔记 的第 14 页最后,不要选中任何东击菜单Form-Lay Out Horizontally完成最终Form的布局,最终

47、结果如下图所示:可以看到,比上面有了些变化,窗口布局的非常合理和漂亮了。可以通过预览来看一看。四,设计工作的一些收尾发现Label的buddy还没有弄好,所以在label中会显示输入的”&”符号,下面编辑一下。点击菜单Edit-Edit Buddies 转到buddy 模式。然后为label选择伙伴buddy,选定一个label,然后把它拖到想绑定的buddy上,比如选定Find whatLabel,然后把它拖到Line Edit上。类似的可以绑定三对buddy,如下图所示:分区 未归档笔记 的第 15 页按F3可以离开buddy模式,进入到窗口编辑模式。同样,可以设置Tab的顺寻,通过点击E

48、dit-Edit Tab Order,进入到编辑taborder的模式,如下图。然后通过点击来改变顺序,同样按F3可以退出编辑模式.关于button方法的绑定,其中Find,Replace,Replace All三个,需要绑定用户自己写的方法,而colse按钮可以绑定到框的reject(),下面看看如何绑定:点击菜单Edit-Edit Signal/Slots,然后点击close button拖一下到form上,放开鼠标左键,会弹出一个Configure connection的框,从左边列表框中点击clicked(),从右边点击reject(),然后点击OK,结束,如下图。按F3离开模式。最后

49、可以给这个框命名,ObjectName设为:FindAndReplaceDlg,把windowTitle设为“Find and Replace”。其中的ObjectName是在程序中要用到这个框时,他的类名,或者import的东西。保存为findandreplacedlg.ui文件。五,转化ui文件为py文件打开cmd命令行,在findandreplacedlg.ui文件所在的目录运行下面 pyuic4 -o ui_findandreplacedlg.py findandreplacedlg.ui 就会在同样的目录生成一个名为ui_findandreplacedlg.py的文件,然后令:就可在

50、别的工程中import这个文件来产生想要的框了。参考资料RaGUI Programing with PyQtchapter 7分区 未归档笔记 的第 16 页源文档PyQt学习笔记(9)Qt Designer(3)(2010-02-20 12:29:30)六,如何在工程中使用如何使用上面产生的py文件呢?首先建立一个findandreplacedlg.py。在这个文件中使用。首先是import import refrom PyQt4.QtCore import * from PyQt4.QtGui import * import ui_findandreplacedlg MAC = qt_ma

51、c_set_native_bar in dir()这里的MAC是个型的,判断的操作系统是否是苹果系统,如果是,MAC=TRUE。然后产生一个框类,注意它的两个父类:class FindAndReplaceDlg(QDialog, ui_findandreplacedlg.Ui_FindAndReplaceDlg):def init (self, text, parent=None): super(FindAndReplaceDlg, self). init (parent) self. text = unicode(text)self. index = 0 self.setupUi(self)

52、 if not MAC:self.findButton.setFocusPolicy(Qt.NoFocus) self.replaceButton.setFocusPolicy(Qt.NoFocus) self.replaceAllButton.setFocusPolicy(Qt.NoFocus) self.closeButton.setFocusPolicy(Qt.NoFocus)self.updateUi()从Qdialod和ui_findandreplacedlg.Ui_FindAndReplaceDlg继承生成一个子类。在初始化函数 init 中,text参数是需要给这个窗口的参数,即

53、要findandreplace的内容,他可以是一个文件,一段字符串等等。Super和以前的一样,框初始化,注意是继承于Qdialog,不是在Designer中设计的框。self.setupUi(self) 这一句的作用才是把在Designer中设计的界面搬到这个框中,包括它的widgets,tab order等等。这个setupUi是在 ui_findandreplacedlg.py中由pyuic4生成的。更重要的是,这个setupUi()方调用QtCore.QmetaObject.connectSlotsByName()方法,这个方法的作用是它会自动创建signal-slots connec

54、tion ,这种connection是基于子类里的方法,和窗口的widgets之间的,只要定义的方法,它的名字是 on_widgetName_signalName的这种格式,就会自动把这个widgets和这个signaName connected。举个例子,在的form中,曾把Find what 这个Label右边的 Line Edit这个widget的ObjectName命名为findLineEdit ,跟这个widget相关的信号,就是这个Line Edit被编辑了,就会emit一个信号textEdited(Qstring),所以如果想绑定这个widget和这个signal,就不用调用co

55、nnected()方法了,只要把方法的名字命名为 on_findLineEdit_textEdited()就可以了,connect的工作就交给 setupUi去完成了。后面的四句setFocusPolicy 是为了方便键盘用户(windows和Linux)的,就是使Tab键只能在可编辑widgets之间切换,对于MAC系统不做执行。最后的setupUi()方法,是为了在findLineEdit没有输入内容的时候,让几个功能按钮不可用,当当输入了以后变为可用。下面是定义一些方法:pyqtSignature(QString)#确保正确的connect,括号里的参数为signal的参数def on_

56、findLineEdit_textEdited(self, text): self. index = 0分区 未归档笔记 的第 17 页self.updateUi()#此函数就是发现LineEdit有内容输入,buttons变为可用 def makeRegex(self):#利用正则表达式来查找内容findText = unicode(self.findLineEdit.text()if unicode(boBox.currentText() =Literal:findText = re.esc(findText)flags = re.MULTILINE|re.DOTALL|re.UNICOD

57、Eif not self.caseCheckBox.isChecked(): flags |= re.IGNORECASEif self.wholeCheckBox.isChecked(): findText = rb%sb % findTextreturnpile(findText, flags)pyqtSignature()def on_findButton_clicked(self): regex = self.makeRegex()match = regex.search(self. text, self. index) if match is not None:self. index

58、 = match.end() self.emit(SIGNAL(found), match.start()else:self.emit(SIGNAL(notfound) pyqtSignature()def on_replaceButton_clicked(self): regex = self.makeRegex()self. text = regex.sub(unicode(self.replaceLineEdit.text(),self. text, 1)pyqtSignature()def on_replaceAllButton_clicked(self): regex = self.

59、makeRegex()self. text = regex.sub(unicode(self.replaceLineEdit.text(),self. text)def updateUi(self):#判断LineEdit是否为空,从而决定buttons是否可用enable = not self.findLineEdit.text().isEmpty() self.findButton.setEnabled(enable) self.replaceButton.setEnabled(enable) self.replaceAllButton.setEnabled(enable)def text

60、(self):#返回修改后的结果return self. text可以用下面的程序测试一下结果:if name = main : import systext = US experienhowst, unlike traditionalpatents,software patents do not encourage innovation and R&D, quite the contrary. In particular they hurt small and medium-sizedentrises and generallyershe market. They will just wea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论