一直没有找到什么好的 pyqt4 的教程,偶然在 google 上搜到一篇不错的入门文档,翻译过来,留以后再复习。
原始链接如下:
在这篇 PyQt4 的入门文档,我们讲学习一些基础功能。
这是一个显示一个小窗口的简单例子。我们可以对这个窗口做一些操作。我们可以改变它的大小,最大化它,或者最小化它。这需要大量的编码。有人已经写好了这些基础函数,因为它在绝大部分应用中重复出现,不需要重复的去编码。PyQt4 是一个高级的工具包。如果我们在一个低级的工具包里编码,下面这个例子可能轻松过百行。
- # ! /usr/bin / python# - *-coding: utf - 8 - *-"""
- ZetCode PyQt4 tutorial
- In this example, we create a simple
- window in PyQt4.
- author: Jan Bodnar
- website: zetcode.com
- last edited: October 2011
- """import sys from PyQt4 import QtGui def main() :
- app = QtGui.QApplication(sys.argv) w = QtGui.QWidget() w.resize(250, 150) w.move(300, 300) w.setWindowTitle('Simple') w.show()
- sys.exit(app.exec_()) if __name__ == '__main__': main()
上面这段代码运行后将在屏幕上显示一个小窗口。
- import sys from PyQt4 import QtGui
我们在这里提供必要的 import,基础的 GUI 窗口部件在
模块里。
- QtGui
- app = QtGui.QApplication(sys.argv)
每一个 PyQt4 的应用必须创建一个
对象。参数
- Application
是一个来自命令行的参数列表。python 脚本可以从 shell 脚本里运行。这是一种我们可以控制我们脚本启动的方式。
- sys.argv
- w = QtGui.QWidget()
部件是一个是 pyqt4 里所有用户接口对象中的基类。我们用默认的
- QtGui.Qwidgt
构造器 (constructor)。默认的构造器没有父类,一个不带父类的窗口部件在窗口被调用。
- QtGui.Qwidgt
- w.resize(250, 150)
这个
方法改变窗口大小。上述语句把窗口改成了 250px 宽,150px 高。
- resize()
- w.move(300, 300)
这个
方法移动窗口到屏幕上坐标为 x,y=(300,300) 的位置
- move()
- w.setWindowTitle('Simple')
上述语句使我们为我们的窗口设置标题,标题会被显示在标题栏 (titlebar)
- w.show()
这个 show() 方法把窗口部件显示在屏幕上。一个窗口是先在内存中创建,然后再在屏幕上显示。
- sys.exit(app.exec_())
最终,我们结束了应用的主循环。主循环是从窗口系统中接收事件并快速的发往应用窗口。当我们调用
方法或者关闭主窗口时,主循环结束。这个
- exit()
方法是确保一个干净的关闭。
- sys.exit()
这个
方法有个下划线,因为
- exec_()
是 python 的一个关键字,所以用
- exec
替代了。
- exec_
如果你按照上面的代码运行,那么应该会得到类似下面这样的状态(我自己修改了窗口的大小,因为 surfacebook 的高分辨率几乎让我看不到原来的标题,但样式大致不会变)
应用图标 (application icon) 是一个被用来显示在标题栏顶部左侧角落的小图片。在下面这个例子中,我们将展示如何在 pyqt4 里面实现它。我们同时也会介绍一些新方法。
#!/usr/bin/python
# -- coding: utf-8 --
- """
- ZetCode PyQt4 tutorial
- This example shows an icon
- in the titlebar of the window.
- author: Jan Bodnar
- website: zetcode.com
- last edited: October 2011
- """import sys from PyQt4 import QtGui class Example(QtGui.QWidget) :
- def __init__(self) : super(Example, self).__init__()
- self.initUI()
- def initUI(self) :
- self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Icon') self.setWindowIcon(QtGui.QIcon('web.png'))
- self.show()
- def main() :
- app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
我们前一个例子是用面向过程的风格编程。python 是一门既支持面向过程又支持面向对象的语言。在 pyqt4 内编程,意味着 OOP(面向对象)。
- class Example(QtGui.QWidget) :
- def __init__(self) : super(Example, self).__init__()...
面向对象中三个最重要的事是类 (class),数据 (data),和方法 (method)。在这里我们创建了一个叫做
的新类。这个
- Example
类是继承于
- Example
,这意味着我们可以调用两个构造器,第一个是对
- QtGui.QWidget
类,另一个是对被继承的类。
- Example
方法返回
- super()
类的父类对象。
- Example
方法是 python 的一个构造器方法。
- __init__()
- self.initUI()
GUI 的创建是被委托给
方法。
- initUI()
- self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Icon') self.setWindowIcon(QtGui.QIcon('web.png'))
这三个方法都是从
类继承过来。
- QtGui.QWidget
方法做两个事。它定位了窗口在屏幕的位置并且设定窗口大小。前两个参数是窗口的 x,y 坐标。第三个参数是窗口宽度,第四个是窗口高度。事实上,它结合了
- setGeometry()
和
- resize()
方法。最后一个方法设定了应用的图标。为了做到这个,我们创建了一个
- move()
类型的对象。
- QtGui.QIcon
接受一个图片的路径(就是你想用来做图标的图片)
- QtGui.QIcon
- def main() :
- app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
启动代码被放在一个
方法内(我想这叫函数更好?)。这是一个 python 的习惯用法。
- main()
运行后类似下图
我们可以给我们的任何一个部件提供一个气泡提示。
- # ! /usr/bin / python# - *-coding: utf - 8 - *-"""
- ZetCode PyQt4 tutorial
- This example shows a tooltip on
- a window and a button
- author: Jan Bodnar
- website: zetcode.com
- last edited: October 2011
- """import sys from PyQt4 import QtGui class Example(QtGui.QWidget) :
- def __init__(self) : super(Example, self).__init__()
- self.initUI()
- def initUI(self) :
- QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10))
- self.setToolTip('This is a <b>QWidget</b> widget')
- btn = QtGui.QPushButton('Button', self) btn.setToolTip('This is a <b>QPushButton</b> widget') btn.resize(btn.sizeHint()) btn.move(50, 50)
- self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Tooltips') self.show()
- def main() :
- app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
在这个例子里,我们为两个 pyqt4 部件显示了一个提示工具。
- QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10))
这个基础的方法设定一个被用来渲染提示工具的字体。我们用了一个 10px 的 SansSerif 字体。
- self.setToolTip('This is a <b>QWidget</b> widget')
为了创建一个提示工具,我们调用
方法。我们同时可以使用富文本。
- setTooltip()
- btn = QtGui.QPushButton('Button', self) btn.setToolTip('This is a <b>QPushButton</b> widget')
我们创建了一个按钮 (button),并且为其设定一个提示工具。
- btn.resize(btn.sizeHint()) btn.move(50, 50)
这个按钮在窗口上被改变大小并且被移动。这个
方法提供了一个按钮的推荐尺寸。
- sizeHint()
运行上面的程序后,效果类似下图
我们之前关闭窗口的方法是点击标题栏的 "x"。在下一个例子里,我们将会展示我们可以程序化的关闭我们的窗口。我们将会稍稍的接触一下信号 (signal) 和槽(slot)。
下面是一个我们将会用在我们例子中的
的构造器。
- QtGui.QPushButton
- QPushButton(string text, QWidget parent = None)
参数是一个被用来展示在按钮上的字符串。
- text
是一个我们按钮的父类部件,在我们的例子里,它将会是
- parent
- QtGui.QWidget
- # ! /usr/bin / python# - *-coding: utf - 8 - *-"""
- ZetCode PyQt4 tutorial
- This program creates a quit
- button. When we press the button,
- the application terminates.
- author: Jan Bodnar
- website: zetcode.com
- last edited: October 2011
- """import sys from PyQt4 import QtGui,
- QtCore class Example(QtGui.QWidget) :
- def __init__(self) : super(Example, self).__init__()
- self.initUI()
- def initUI(self) :
- qbtn = QtGui.QPushButton('Quit', self) qbtn.clicked.connect(QtCore.QCoreApplication.instance().quit) qbtn.resize(qbtn.sizeHint()) qbtn.move(50, 50)
- self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Quit button') self.show()
- def main() :
- app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
在这个例子里,我们创建了一个离开按钮。点击按钮,应用将会被终止
运行后效果类似下图
默认的,如果我们点击了标题栏的 "X",
将会被关闭。有些时候我们想要修改这个默认的行为。举个例子,如果我们有一个文件在一个编辑器内被打开,并且做了些修改,退出时我们会显示一个消息盒子让人确定这个动作。
- QtGui.QWidget
- # ! /usr/bin / python# - *-coding: utf - 8 - *-"""
- ZetCode PyQt4 tutorial
- This program shows a confirmation
- message box when we click on the close
- button of the application window.
- author: Jan Bodnar
- website: zetcode.com
- last edited: October 2011
- """import sys from PyQt4 import QtGui class Example(QtGui.QWidget) :
- def __init__(self) : super(Example, self).__init__()
- self.initUI()
- def initUI(self) :
- self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Message box') self.show()
- def closeEvent(self, event) :
- reply = QtGui.QMessageBox.question(self, 'Message', "Are you sure to quit?", QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.Yes: event.accept()
- else: event.ignore()
- def main() :
- app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
如果我们关闭
,
- QtGui.QWidget
将会被触发。为了修改部件行为我们需要重新实现
- QtGui.QCloseEvent
事件 handler。
- closeEvent
- reply = QtGui.QMessageBox.question(self, 'Message', "Are you sure to quit?", QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No)
我们展示了一个带有两个按钮的消息盒子:yes 和 no,第二个字符串是对话框显示的字符串。第三个参数具体规定了按钮和显示文字的组合。最后一个参数是默认的按钮。它是一个初始化的键盘 focus 的按钮。(就是直接 enter 时选择的按钮)。返回值被存储在
变量中。
- reply
- if reply == QtGui.QMessageBox.Yes: event.accept()
- else: event.ignore()
我们测试了返回值。如果点击了 yes 按钮,我们接受一个关闭部件的时间并且关闭应用。其他情况我们关闭这个事件。
运行后类似下图:
下面的脚本显示我们如何在桌面屏幕上中心化一个窗口
- # ! /usr/bin / python# - *-coding: utf - 8 - *-"""
- ZetCode PyQt4 tutorial
- This program centers a window
- on the screen.
- author: Jan Bodnar
- website: zetcode.com
- last edited: October 2011
- """import sys from PyQt4 import QtGui class Example(QtGui.QWidget) :
- def __init__(self) : super(Example, self).__init__()
- self.initUI()
- def initUI(self) :
- self.resize(250, 150) self.center()
- self.setWindowTitle('Center') self.show()
- def center(self) :
- qr = self.frameGeometry() cp = QtGui.QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft())
- def main() :
- app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
类提供了关于用户桌面的信息,包括屏幕尺寸
- QtGui.QDesktopWidget
- self.center()
这行代码将会将窗口置于屏幕中心
- qr = self.frameGeometry()
我们在主窗口内得到一个指定的长方形几何体。
- cp = QtGui.QDesktopWidget().availableGeometry().center()
我们得到了显示器的中心点。
- qr.moveCenter(cp)
我们的长方形窗口已经有了宽度和高度,现在我们设定它的中心在屏幕中心。它的大小不变。
- self.move(qr.topLeft())
我们移动应用窗口的左上点到长方形的左上角,至此我们就将窗口移动到了中央。
在这一节 pyqt4 的教程中,我们讨论了一些基本的内容。
翻译和补充的有误的地方,欢迎在评论区指正。
来源: http://www.cnblogs.com/chuxiuhong/p/5865201.html