首先是一个简单的程序
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()
代码运行的结果是一个题目名字是 Simple 的简单窗口。
顾名思义,在PyQt 中,关于GUI的一系列的object模块都存放在 PyQt.QtGui 中。从PyQt中导入这个模块。
app = QtGui.QApplication(sys.argv)
使用 QtGui.QApplication 方法创建一个应用。sys.argv 是从 command line 中得到的参数(作为初学者这一点还有些迷惑,可以参见这个博文 http://blog.csdn.net/vivilorne/article/details/3863545 或者官方文档搜索 )
w = QtGui.QWidget()
使用 QWidget 函数创建这个应用的窗口。QWidget是创建窗口的 default constructor,没有父类。
w.resize(250, 150) w.move(300, 300)
对窗口的尺寸进行操作。resize 的参数是(宽,高),move 的参数是(x,y)
w.setWindowTitle('Simple') w.show()
对窗口进行命名之后,窗口会在内存中创建,并在屏幕上被打印出来。
sys.exit(app.exec_())
在结束整个程序时 app.exec_() 会返回一个状态码 0,而 sys.exit 则会读取这个状态码然后退出。
2. 现在在窗口上加入一个图标
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()
这段代码是使用object的方式。首先,在 mian 函数中,使用 QApplication 方法创建应用。其次,创建ex。
def __init__(self): super(Example, self).__init__() self.init()
example是继承自QWidget的类,使用super首先调用QWidget的constructor。 self.init()将创建GUI授权给了init方法
def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Icon') self.setWindowIcon(QtGui.QIcon('web.png')) self.show()
在init方法中,在窗口中创建图标的是self.setWindowIcon(QtGui.QIcon('web.png')). 其中QtGui.QIcon类被创建是接收被打印成图标的图片文件的路径。之后setWindowIcon方法把QtGui.Icon对象打印成窗口的图标。
http://www.crifan.com/summary_the_meaning_of_self_and___init___in_python_and_why_need_them/
http://www.cnblogs.com/dkblog/archive/2011/02/24/1980654.html
(这两篇文章有比较详细的解释 self __init 以及 super 的含义及使用)
3. Button
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()
给窗口创建一个button
QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10)) self.setToolTip('This is a <b>QWidget</b> widget')
QTooltip 方法,给窗口添加一个 tooltip。QFont 方法规定 tooltip 的字体以及大小,再由setFont方法进行设置。setToolTip方法则设置了tooltip的文本内容。<b>QWidget</b>则表示这一段的文本是加黑的。需要注意的是,由于self的类是QWidget,也就是说self对应的是创建的窗口,所以tooltip是这个窗口的tooltip
btn = QtGui.QPushButton('Button', self) btn.setToolTip('This is a <b>QPushButton</b> widget') btn.resize(btn.sizeHint()) btn.move(50, 50)
QPushButton方法在窗口中创建一个名字为Button的按键。btn.setTooltip是给这个btn创建一个tooltip。然后使用resize和move方法规定大小和位置
4. QtCore
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()
这是创建了一个退出按钮。PyQt中关于Quit的模块是放在QtCore当中,因此,import QtCore。
qbtn = QtGui.QPushButton('Quit', self) qbtn.clicked.connect(QtCore.QCoreApplication.instance().quit)
使用QPushButton方法创建了一个按钮。clicked.connect方法将这个按钮的功能与参数联系起来,赋予按钮退出的功能
5. MessageBox
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()
我们可以看到,添加了一个新的方法,CloseEvent 用来处理关闭事件
reply = QtGui.QMessageBox.question(self, 'Message',"Are you sure to quit?", QtGui.QMessageBo x.Yes|QtGui.QMessageBox.No, QtGui.QMessageBox.No)
'Message’是MessageBox的标题,而‘Are you sure to quit?’ 则是内容,第三个参数是出现在窗口上的两个选项,Yes和No。而最后一个则是默认选项。reply则接收选择的结果。
if reply == QtGui.QMessageBox.Yes: event.accept() else: event.ignore()
然后由这个if-else语句来判断对窗口的操作。(这里我也是有个疑问,程序中没有什么地方说明了这是在关闭窗口的时候才会触发的 messagebox?为什么只有关闭窗口这一项操作的时候才会有这个reply?)
6. Postion
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()
可以看到新建了一个center方法,其中frameGeometry是获得窗口的像素大小,然后创建一个相同大小的矩形。cp则是通过解析屏幕的像素获得屏幕中心的位置。movecenter方法将这个矩形移动到screen的中心。而self的move方法则将窗口的左上角移动到矩形的左上角,因而相当于将窗口移动到矩形的位置,也就是screen的中心位置。