OK , 在Linux的开发环境下,对于我们的简短的PySide程序而言,不需要使用QtCreator,使用文本编辑器。之所以,使用文本编辑器,是因为小应用代码量很少,更重要的是一行行的写可以加深我们对于Qt应用的理解。不过,当我们对整个程序的结构有着比较清晰的认识之后,我们就只需要将精力关注在那些发生改变的部分即可。在这里,我推荐VIM和一个叫做snipmate的插件。

在Hello PySide中,我们写了一个经典的Hello World 。 它在我的Fedora上的实现效果如下:

感觉看起来还不错,但是这个界面的显示只是一个QLabel元素,加上Font属性的 Hello World ,并且显示在屏幕的左上角。距离我们想要的东西还差的很远。

我读大学的时候学习了一门SSD课程,SSD4吧(记不太清楚,好像使用VB)是专门讲界面设计的一些原则的课程。一个界面至少应该有标题,大小,菜单栏,工具栏,状态栏甚至应该具有某些布局等等,并且要考虑到用户的一些使用习惯等等,例如获取焦点,自动切换,以用户为中心的人机交互设计。但是对于HelloWorld而言,它没有自定义的标题,大小是由字体决定等等。万幸的是,Qt给我们提供了丰富的元素来创建这些内容,只需要设置好这些元素的规则即可。

接下来我们使用Widget来创建一个HelloWorld。它应该具有以下的特点,大小,标题。

  1. #!/usr/bin/python
  2. #coding:utf-8
  3. #Filename:WigetHelloWorld.py
  4.  
  5. import sys
  6. from PySide.QtCore import *
  7. from PySide.QtGui import *
  8.  
  9. app = QApplication(sys.argv)
  10.  
  11. widget = QWidget()
  12. widget.resize(250,150)
  13. widget.setWindowTitle("Hello World")
  14. label = QLabel("<font color=red size=30>Hello world </font>",widget)
  15. label.move(50,50)
  16. widget.show()
  17.  
  18. sys.exit(app.exec_())

第十一行:使用QWidget创建一个Widget对象

第十二行:重新设置Widget的大小,宽度250,高度150

第十三行:设置窗口标题 Hello World

第十四行:在widget上添加一个label,注意要将widget作为一个参数传递给QLabel

第十五行:将label移动到距离widget顶端距离50,左边距离50的位置

效果如下图:

比第一个寒酸的界面显得更加大气一点了。但是我们的代码这样写就会很乱,如果继续添加QPushButton,其他处理等等,不方便管理。既然我们使用一个QWidget类,何不继承它,将需要进行的操作放在子类中。这一点和JAVA的界面编程风格类似。所以对以上代码进行重构:

  1. #!/usr/bin/python
  2. #coding:utf-8
  3. #Filename:WigetHelloWorld.py
  4.  
  5. import sys
  6. from PySide.QtCore import *
  7. from PySide.QtGui import *
  8. class Example(QWidget):
  9. def __init__(self):
  10. super(Example,self).__init__()
  11. self.initUI()
  12. def initUI(self):
  13. label = QLabel("<font color=red size=30>Hello World</font>",self)
  14. label.move(50,50)
  15. self.setGeometry(300,300,250,150)
  16. self.setWindowTitle("Hello World")
  17. self.show()
  18. def main():
  19. app = QApplication(sys.argv)
  20. ex = Example()
  21. sys.exit(app.exec_())
  22. if __name__ == "__main__":
  23. main()

本版本中采用OOP的编程思想:类,数据和方法。这里创建了一个Example类,Example类继承QWidget。因此,在构造函数中,需要调用超类的构造函数。

  1. self.setGeometry(300,300,250,150)
    setGeometry的功能主要有两个:定位Widget在桌面上的位置和设置窗口的大小,前两个参数设置距离屏幕lefttop的距离,后两个参数设置窗口的高和宽。
  1.  

这样做的好处就是,可以是我们将注意力集中在对整个界面上的编程中,无需关注其他重复的内容。这也是往下的一个基础框架,以后所有的程序都将在如下框架的基础上完成,那么请在vim插件中的python.snippetst中添加自定义的触发器,我的配置如下:

  1. snippet #
  2. #!/usr/bin/python
  3. #coding:utf-8
  4. #Filename:${1:filename}
  5. snippet qt
  6. import sys
  7. from PySide.QtCore import *
  8. from PySide.QtGui import *
  9. class ${1:classname}:
  10. def __init__(self):
  11. super(${2:classname},self).__init__()
  12. self.initUI()
  13. def initUI(self):
  14. ${3:initUI}
  15. def main():
  16. app = QApplication(sys.argv)
  17. ${4:TODO}
  18. sys.exit(app.exec_())
  19. if __name__ == "__main__":
  20. main()

打开vim,进入插入模式,输入#,按下tab,vim就会自动给你补全开篇三行。接下来,输入qt,按下tab,就会把整个框架放在你的vim中。

PySide 简易教程<二>-------工欲善其事,必先利其器的更多相关文章

  1. WebGL简易教程(二):向着色器传输数据

    目录 1. 概述 2. 示例:绘制一个点(改进版) 1) attribute变量 2) uniform变量 3) varying变量 3. 结果 4. 参考 1. 概述 在上一篇教程<WebGL ...

  2. PySide 简易教程<一>-------Hello PySide

    PySide 是一个python绑定的跨平台GUI Qt库.目前,支持Python的Qt库有两个PyQt和PySide.PySide是一个免费的软件,与PyQt不同之处在于使用了LGPL,允许PySi ...

  3. PySide 简易教程<三>-------动手写起来

    到目前为止,已经接触的Pyside的界面元素有如下几个:QWidget.QPushButton.QLabel.本次再介绍两个tooltip和messagebox.tooltip是一个鼠标悬浮提示信息, ...

  4. Dart 语言简易教程系列

    google Fuchsia系统 及 dart语言简介 在 InteIIiJ IDEA 中搭建 Dart 的开发环境 Dart Linux 开发环境搭建 Dart 语言简易教程(一) Dart 语言简 ...

  5. WebGL简易教程(三):绘制一个三角形(缓冲区对象)

    目录 1. 概述 2. 示例:绘制三角形 1) HelloTriangle.html 2) HelloTriangle.js 3) 缓冲区对象 (1) 创建缓冲区对象(gl.createBuffer( ...

  6. WebGL简易教程(四):颜色

    目录 1. 概述 2. 示例:绘制三角形 1) 数据的组织 2) varying变量 3. 结果 4. 理解 1) 图形装配和光栅化 2) 内插过程 5. 参考 1. 概述 在上一篇教程<Web ...

  7. WebGL简易教程——目录

    目录 1. 绪论 2. 目录 3. 资源 1. 绪论 最近研究WebGL,看了<WebGL编程指南>这本书,结合自己的专业知识写的一系列教程.之前在看OpenGL/WebGL的时候总是感觉 ...

  8. mysql进阶(二)索引简易教程

    Mysql索引简易教程 基本概念 索引是指把你设置为索引的字段A的内容储存在一个独立区间S里,里面只有这个字段的内容.在找查这个与这个字段A的内容时会直接从这个独立区间里查找,而不是去到数据表里查找. ...

  9. Ocelot简易教程(二)之快速开始2

    为什么这篇的标题叫"Ocelot简易教程(二)之快速开始2"呢,因为很多朋友跟我说上一篇" Ocelot简易教程(二)之快速开始1"内容太少了,只是简单介绍Oc ...

随机推荐

  1. Java基础知识强化之IO流笔记77:NIO之 Selector

    Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接. 1.  ...

  2. jsp中调用getOutputStream()产生冲突

    再用jsp进行图片的生成的时候,例如一些验证码,比例图的时候,在对图片进行输出调用 getOutputStream() 的时候会报该方法已经被调用的冲突. 例如如下的程序: <%@ page c ...

  3. xml格式化成json

    JsonConvert.SerializeObject(model)   XmlDocument doc = new XmlDocument();                    doc.Loa ...

  4. 《UNIX环境高级编程》学习心得 二

    窝萌来看我们看到这本书里的第一个程序 #include "apue.h" #include <dirent.h> int main(int argc, char *ar ...

  5. noi 97 积木游戏

    思路:黑书的例题 #include<map> #include<set> #include<cmath> #include<queue> #includ ...

  6. Python(2.7.6) 标准日志模块 - Logging Configuration

    除了使用 logging 模块中的 basicConfig 方法配置日志, Python 的 logging.config 模块中, dictConfig 和 fileConfig 方法分别支持通过字 ...

  7. char*,const char*和string 三者转换

    1. const char* 和string 转换 (1) const char*转换为 string,直接赋值即可. EX: const char* tmp = "tsinghua&quo ...

  8. SourceTree基本操作

    下载地址:https://www.sourcetreeapp.com 1.从克隆远程仓库 2.填写git地址 3.克隆成功后会来点如下界面,点击testGitHub 4.scourceTree管理界面 ...

  9. Android ViewFlipper用法浅析

    在Android应用开发中,我们经常会需要实现左右切换视图的功能,这通常需要在LinearLayout.RelativeLayout等布局中添加ImageView来实现.如果每次只需展示一张图片,并可 ...

  10. ORACLE的分组统计之CUBE(二)

    cube统计包含了rollup的统计结果,而且还有其他组合分组结果(小计),CUBE(n列),那么分组种类有: cube分组就是先进行合计(一个不取),然后小计(到),最后取标准分组. 与rollup ...