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

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 sys
from PyQt4 import QtGui

app = 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 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()    

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

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

import sys
from PyQt4 import QtGui, QtCore

btn = 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 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 事件会被触发,可以通过重写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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值