• PyQt4入门学习笔记(一)


    PyQt4入门学习笔记(一)

    一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习。

    原始链接如下:

    http://zetcode.com/gui/pyqt4/firstprograms/

    在这篇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对象。参数sys.argv是一个来自命令行的参数列表。python脚本可以从shell脚本里运行。这是一种我们可以控制我们脚本启动的方式。

    w = QtGui.QWidget()
    

    QtGui.Qwidgt部件是一个是pyqt4里所有用户接口对象中的基类。我们用默认的QtGui.Qwidgt构造器(constructor)。默认的构造器没有父类,一个不带父类的窗口部件在窗口被调用。

    w.resize(250, 150)
    

    这个resize()方法改变窗口大小。上述语句把窗口改成了250px宽,150px高。

    w.move(300, 300)
    

    这个move()方法移动窗口到屏幕上坐标为x,y=(300,300)的位置

    w.setWindowTitle('Simple')
    

    上述语句使我们为我们的窗口设置标题,标题会被显示在标题栏(titlebar)

    w.show()
    

    这个show()方法把窗口部件显示在屏幕上。一个窗口是先在内存中创建,然后再在屏幕上显示。

    sys.exit(app.exec_())
    

    最终,我们结束了应用的主循环。主循环是从窗口系统中接收事件并快速的发往应用窗口。当我们调用exit()方法或者关闭主窗口时,主循环结束。这个sys.exit()方法是确保一个干净的关闭。

    这个exec_()方法有个下划线,因为exec是python的一个关键字,所以用exec_替代了。

    如果你按照上面的代码运行,那么应该会得到类似下面这样的状态(我自己修改了窗口的大小,因为surfacebook的高分辨率几乎让我看不到原来的标题,但样式大致不会变)

    image1

    应用图标

    应用图标(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类的父类对象。__init__()方法是python的一个构造器方法。

    self.initUI()
    

    GUI的创建是被委托给initUI()方法。

    self.setGeometry(300, 300, 250, 150)
    self.setWindowTitle('Icon')
    self.setWindowIcon(QtGui.QIcon('web.png'))  
    

    这三个方法都是从QtGui.QWidget类继承过来。

    setGeometry()方法做两个事。它定位了窗口在屏幕的位置并且设定窗口大小。前两个参数是窗口的x,y坐标。第三个参数是窗口宽度,第四个是窗口高度。事实上,它结合了resize()move()方法。最后一个方法设定了应用的图标。为了做到这个,我们创建了一个QtGui.QIcon类型的对象。QtGui.QIcon接受一个图片的路径(就是你想用来做图标的图片)

    def main():
        
        app = QtGui.QApplication(sys.argv)
        ex = Example()
        sys.exit(app.exec_())
    
    
    if __name__ == '__main__':
        main()   
    

    启动代码被放在一个main()方法内(我想这叫函数更好?)。这是一个python 的习惯用法。

    运行后类似下图
    image2

    展示一个提示工具

    我们可以给我们的任何一个部件提供一个气泡提示。

    #!/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()方法提供了一个按钮的推荐尺寸。

    运行上面的程序后,效果类似下图

    image3

    关闭窗口##

    我们之前关闭窗口的方法是点击标题栏的"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()
    

    在这个例子里,我们创建了一个离开按钮。点击按钮,应用将会被终止

    运行后效果类似下图

    image4

    消息盒子##

    默认的,如果我们点击了标题栏的"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.QWidgetQtGui.QCloseEvent将会被触发。为了修改部件行为我们需要重新实现closeEvent事件handler。

    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按钮,我们接受一个关闭部件的时间并且关闭应用。其他情况我们关闭这个事件。

    运行后类似下图:

    image5

    将窗口置于屏幕中间##

    下面的脚本显示我们如何在桌面屏幕上中心化一个窗口

    #!/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的教程中,我们讨论了一些基本的内容。

    翻译和补充的有误的地方,欢迎在评论区指正。

    新博客迁移至https://chuxiuhong.com/
  • 相关阅读:
    python 脚本 百里守约100%瞬狙
    Vue.js框架:超出配置登出时间就会退出登陆(前端设置)
    记一次canvas叠加错位的问题(unity2017)
    找到一篇很牛的内存管理文章(转)
    lua 懒注入
    CPP和C#交互语法速览
    CPP和C#交互实践
    CPP和C#交互
    Linux配置SFTP
    pandas Dataframe merge 后出现重复行
  • 原文地址:https://www.cnblogs.com/chuxiuhong/p/5865201.html
Copyright © 2020-2023  润新知