PyQt4 tutorial读书笔记(1)基础篇

来源:互联网 发布:网络运维在做什么 编辑:程序博客网 时间:2024/05/22 03:16

PyQt4 tutorial链接:http://zetcode.com/gui/pyqt4/英文版的,看着也不难,实例举的简单易懂,很不错。简易点记录一下。

1、Every PyQt4 application must create an application object. The application object is located in the QtGui module. The sys.argv parameter is a list of arguments from the command line.

import sysfrom PyQt4 import QtGuiapp = QtGui.QApplication(sys.argv)sys.exit(app.exec_())

调用sys.exit()可以确保一个clean exit(),而且环境将被告知程序是如何退出的。

2、关于控件大小和位置问题

(1)resize() 控件的大小函数
move(300, 300) 控件在显示屏幕中的坐标
setGeometry(300,300,450,250) 控件在显示屏幕中的坐标以及控件的大小
控制控件大小和位置只有这三个函数,和layout无关。
(2)sizeHint、minimumSizeHint、sizePolicy
参考链接:http://blog.csdn.net/zzwdkxx/article/details/32116999
btn.resize(btn.sizeHint())控件可以这样调用设置大小,
这个属性所保存的 QSize 类型的值是一个被推荐给窗口或其它组件(为了方便下面统称为widget)的尺寸,也就是说一个 widget 该有多大,它的一个参考来源就是这个sizeHint 属性的值,而这个值由 sizeHint() 函数来确定。但是 widget 的大小的确定还有其它因素作用,下面会讲到。现在只需知道 sizeHint() 会返回一个被推荐的尺寸。那么这个尺寸的取值是怎样的呢?当它是一个无效值的时候(sizeHint().isValid() 返回 false,QSize 中 width 或者 height 有一个为复数就会是无效的),什么作用也没有;当它是一个有效值的时候,它就成了 widget 大小的一个参考。Qt 中对 sizeHint() 的默认实现是这样的:当 widget 没有布局(layout),返回无效值;否则返回其 layout 的首选尺寸(preferred size)。

3、编辑一个简单的展示框,设置标题以及图标

import sysfrom PyQt4 import QtGuiclass 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()    

4、tooltip 控件的提示框和按钮button

(1)当鼠标在该控件上的时候会弹出的小小提示框。
QtGui.QToolTip.setFont(QtGui.QFont(‘SansSerif’, 10))设置提示的文字类型和字号大小。
控件对象.setToolTip(提示框文字)进行调用和设置。
需要加粗的文字用包围
(2)按钮第一个参数即为显示文本,可以用setText()修改。
(3)按钮点击事件(信号与槽)以及窗口关闭
以下只是简单的代码片段,关键语句组合。

import sysfrom PyQt4 import QtGui, QtCorebtn = QtGui.QPushButton('Button', self)btn.setToolTip('This is a <b>QPushButton</b> widget')btn.resize(btn.sizeHint())btn.move(50, 50)   btn.clicked.connect(QtCore.QCoreApplication.instance().quit)    

5、窗口关闭closing a window和 Message box

import sysfrom PyQt4 import QtGuiclass 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 事件会被触发,可以通过重写closeEvent()来修改关闭事件发生时控件的行为。

reply = QtGui.QMessageBox.question(self,'Message',"Are you sure to quit?",QtGui.QMessageBox.Yes|QtGui.QMessageBox.No,QtGui.QMessageBox.No)

这个生成了一个有yes 和no两个按钮的messagebox。第一个参数出现在message box的标题栏,第二个表示该对话框的消息文本。第三个参数指定出现在对话框的按钮组合,最后一个参数指定默认的按钮,在初始拥有焦点。返回值被赋给了reply变量。

==》扩展 :PyQt中的Event(事件)简介
转载链接:http://www.2sos.net/essay/PyQtGuide-Event.html

PyQt 中各种Widget(部件)所响应的Event(事件)通常由用户的交互行为产生。

QT中通过调用特定的事件处理函数将包含事件信息的QEvents子类实例传递给Widget(部件),如果该部件仅作为容器包含子部件而没有什么事件响应的动作,那该容器部件无需编写任何事件处理代码。如果你希望检测到容器内对于子部件的鼠标单击行为,则需要在容器部件的mousePressEvent()中调用子部件的underMouse() 函数。The Scribble example implements a wider set of events to handle mouse movement, button presses, and window resizing。

以下从最常见的事件开始,简要介绍Qwidget的主要事件:

Widget重绘时调用painEvent()函数。显示定制内容的部件必须重载此函数。绘制使用的QPainter类只能在paintEvent()或paintEvent()的子函数内使用部件大小调整后调用resizeEvent() 函数。光标位于Widget(部件)内或Widget(部件)通过grabMouse()获取鼠标焦点后,一旦按下鼠标按钮,将调用mousePressEvent()函数。Pressing the mouse without releasing it is effectively the same as calling grabMouse().鼠标按钮放开后调用mouseReleaseEvent()函数。部件只有在接受鼠标单击事件的情况下,才会接受到该单击的释放事件。也就是说若有用户在部件中按下鼠标按钮不放,移动到部件外后再放开,这个部件也将会收到该鼠标按钮释放信息。这里有一个例外:当弹出菜单在鼠标按住时已显示,弹出菜单将接受鼠标释放事件。双击部件时调用mouseDoubleClickEvent()函数。双击时部件先后接收到鼠标按下、放下事件,并将第二次的按下事件转化为双击事件(双击时鼠标移动的话还会发生鼠标移动事件)。很难从第一个单击鼠标的动作就能区分出双击事件(这也是为什么绝大多数的GUI界面设计的书籍建议双击最好设计成为单击事件扩展操作,而不是触发完全不同的操作。)

接受键盘输入的部件需要重载更多的事件处理函数:

某个键位按下或按着不放的持续时间超过自重复时间的,将调用keyPressEvent()函数。只有当部件不使用焦点转移(focus-change mechanisms)时,Tab或Shift+Tab的按键信息才会传递给部件。若你想把这些按键信息传递给部件,你需要重载 QWidget.event()。部件获得键盘焦点(假定你调用了setFocusPolicy()函数)时调用focusInEvent() 函数。功能良好的部件在获取键盘焦点上通常采用一种简单明了的方式。部件失去焦点时调用focusOutEvent() 函数。

除此以外,你可能需要重载一些不那么常用的事件处理函数。

鼠标按键按下时,鼠标移动会调用mouseMoveEvent()函数。多用于拖拽操作。若你调用了setMouseTracking(true),那么即使鼠标按钮未被按下, 鼠标移动事件亦会被唤起(参阅 Drag and Drop 指南.)键盘按键弹起后或按键被按着不放(若按键设置有自重复)会调用keyReleaseEvent()函数。在按住不放的情况向下,每个循环会收到两个弹起、一个按键事件。只有当部件不使用焦点转移(focus-change mechanisms)时,Tab或Shift+Tab的按键信息才会传递给部件。若你想把这些按键信息传递给部件,你需要重载 QWidget.event()。部件拥有焦点时,用户推动鼠标转轮将调用wheelEvent()函数。当光标进入部件的屏幕空间范围时调用enterEvent()函数。 (不包含子部件空间)当光标离开部件的屏幕空间范围时调用了leaveEvent()函数,光标进入子部件空间范围时不引起该事件。部件相对于其父部件移动后,调用moveEvent()部件关闭或调用了close()函数后,调用closeEvent()QEvent.Type的文档中还描述了一些相当隐蔽的事件,要处理这些事件,需要直接重载event().event()函数的原始实现用于处理Tab和Shift+Tab (移动键盘焦点),并将其他绝大多数的事件传递给以上提高的专门处理函数. Events and the mechanism used to deliver them are covered in The Event System.

6、让控件显示在中间

 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.topRight())

self.frameGeometry():得到一个长方形指定主窗口的几何形状。这包括任何窗口框架。
QtGui.QDesktopWidget().availableGeometry().center():得到显示屏的分辨率计算得出中心点位置。
moveCenter(cp):矩形在之前已经有自己的长宽了,在这里把矩形的中心点和屏幕的中心点重合,矩形的长宽不变。
self.move(qr.topRight()):将应用程序窗口的左上点和矩形左上点重合,这样窗口就能显示在中心了。

0 0
原创粉丝点击