初识 UNIX (2008年7月 – 2008年12月 )

SGI

2008年,第一份工作– UNIX C 软件工程师,这是我第一次接触 UNIX 系统(图片来自维基百科)。是的,界面很土气。当时的工作环境就是在 window xp 安装一个 X 客户端,直接远程到 SGI 服务器(后来才知这东西是电厂的,公司借来孵蛋–公司真穷呀)。笔者非计算机科班出生,最终却走上了IT之路,自然是什么都不会,什么都得学。好在那时有同事耐心指导调教,渐渐了解如何编程。那时,阅读峰哥的代码,是一种享受,干净,思路清晰。也就在那两年里,先后接触 Readhat 企业版 5.0和 Ubuntu。UNIX 玩不起(毕竟 UNIX 这东西不是咱穷兄弟玩得起的),咱可以在虚拟机里安装一个 Linux。于是开始走上折腾 Linux 之路。

Read More

本文以 Hello World 为例,讲解如何编译安装 PyQt5。

安装 SIP

由于 PyQt 是使用 SIP 进行封装的,所以在编译安装 PyQt5 前,需要先安装 SIP。在官网下载 sip-4.14.7.tar.gz 安装包。

解包并编译安装:

1
2
3
4
$ tar -xzvf sip-4.14.7.tar.gz
$ cd sip-4.14.7
$ python configure.py && make
$ sudo make install

安装 PyQt5

同样在 PyQt5 官网下载 PyQt-gpl-5.0.tar.gz 安装包。

解包并编译:

1
2
3
4
$ tar -xzvf PyQt-gpl-5.0.tar.gz
$ cd PyQt-gpl-5.0
$ python configure.py --sip-incdir=/usr/include/python2.7
$ make

若编译中找不到 Python.h 头文件,请安装 python2.7-dev

1
$ sudo apt-get install python2.7-dev

若安装 python2.7-dev 后编译,仍然报错找不到 Python.h 头文件

1
$ sudo ln -s /usr/include/python2.7 /usr/local/include/python2.7

编译结束后,进行安装:

1
$ sudo make install

PyQt5 示例

开始编写 PyQt5 示例 Hello World:

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import (QApplication, QLabel)
import sys
if __name__ == "__main__":
app = QApplication(sys.argv)
label = QLabel("<center>Hello World with PyQt5!</center>")
label.resize(200, 50)
label.show()
sys.exit(app.exec_())

:以上操作是在 Ubuntu 12.04.2 系统下完成的。

本文将讲解如何在 PyQt4 程序中调用 QML。

QML 简介

QML 又称 Qt 元对象语言或 Qt 建模语言,是基于 JavaScript 的描述性语言,常用于设计用户界面。详细介绍见于 QML 维基百科

QML 示例

编辑 hello.qml,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
import QtQuick 1.0
Rectangle {
id: page
width: 500; height: 200
color: "lightgray"
Text {
id: helloText
text: "Hello QML & PyQt4"
font.pointSize: 24; font.bold: true
anchors.centerIn: parent
}
}

解析

第一行是 qml 脚本中约定俗成的。Rectangle 定义了一个 500 x 200 的矩形区域,其背景颜色为浅灰色。Text 中定义了一个文本字符串“Hello QML & PyQt4”,字体大小为24,黑体。

PyQt4 调用 QML

编辑 pyqt-qml.py,文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtDeclarative import QDeclarativeView
if __name__ == "__main__":
app = QApplication(sys.argv)
view = QDeclarativeView()
view.setSource(QUrl('hello.qml'))
view.setResizeMode(QDeclarativeView.SizeRootObjectToView)
view.show()
sys.exit(app.exec_())

运行 pyqt-qml.py,界面如下:

QML

附:截图中所显示的与文中的 QML 略有不同,截图代码见于 pyqt-qml

本文简述如何在 django blog 中添加分页·「Paginator」功能。

安装

假设读者的机器已安装 django,请使用以下命令安装 django-pagination:

1
2
$ sudo apt-get install pip
$ sudo pip install django-pagination

或从 github 上获取源码进行安装:

1
2
3
$ git clone https://github.com/ericflo/django-pagination.git pagination
$ cd pagination
$ sudo python setup.py install

使用 django-pagination

修改 settings

修改工程目录下的 settings.py 文件中 INSTALLED_APPS:

1
2
3
4
INSTALLED_APPS = (
# ...
'pagination',
)

在 middleware 中添加 pagination:

1
2
3
4
MIDDLEWARE_CLASSES = (
# ...
'pagination.middleware.PaginationMiddleware',
)

修改视图

修改 app 中的 view.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
# Create your views here.
def blog_list(request):
blogs = Blog.objects.all()
p = Paginator(blogs, 2)
page = request.GET.get('page')
try:
posts = p.page(page)
except PageNotAnInteger:
posts = p.page(1)
except EmptyPage:
posts = p.page(p.num_pages)
return render_to_response("blog_list.html", {"blogs": posts})

修改模版

修改 app 对应的模版文件,对要分页的列表变量进行分页:

1
2
3
{% raw %}
{% autopaginate object_list %}
{% endraw %}
参考资料:

本篇用 PyQt4 实现自定义 ClickableLabel,即当鼠标左键双击Label时,就会触发clicked()信号,然后响应槽函数。文中主要讲解如何用 PyQt4 实现自定义信号。

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/python
# -*- coding: utf-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
"""
A clickable label implemented with PyQt4
"""
class ClickableLabel(QLabel):
"""
clicked signal definition
"""
clicked = pyqtSignal()
def __init__(self, text = "", parent = None):
super(ClickableLabel, self).__init__(text, parent)
self.setText(text)
self.clicked.connect(self.onClicked)
def onClicked(self):
text = self.text()
text = "<center><font color=red>" + text + "</font></center>"
self.setText(text)
def mouseDoubleClickEvent(self, event):
if event.button() == Qt.LeftButton:
self.clicked.emit()
if __name__ == "__main__":
app = QApplication(sys.argv)
label = ClickableLabel("Click Me")
label.resize(240, 50)
label.setWindowTitle("Clickable Label")
label.show()
sys.exit(app.exec_())

解析

定义 ClickableLabel

1
2
3
4
5
6
class ClickableLabel(QLabel):
"""
clicked signal definition
"""
clicked = pyqtSignal() # 定义 clicked() 信号,此处无参数

首先定义 ClickabelLabel 类继承 QLabel,并定义信号 clicked()。

构造函数

1
2
3
4
5
def __init__(self, text = "", parent = None):
super(ClickableLabel, self).__init__(text, parent)
self.setText(text)
self.clicked.connect(self.onClicked)

构造函数中实现 ClickableLabel 的文本设置并将自定义信号clicked()与槽函数onClicked()连接起来。

clicked() 信号

1
2
3
def mouseDoubleClickEvent(self, event):
if event.button() == Qt.LeftButton:
self.clicked.emit()

重载 mouseDoubleClickEvent() 方法,当鼠标左键双击 ClickabelLabel 构件时,触发 clicked() 信号。

槽函数

1
2
3
4
def onClicked(self):
text = self.text()
text = "<center><font color=red>" + text + "</font></center>"
self.setText(text)

onClicked() 槽函数,将文本的内容设置为红色并置中。

ubuntu 13.04 安装搜狗拼音输入法

首先卸载系统自带的ibus:

1
$ sudo apt-get remove ibus

添加 fcitx ppa 安装源:

1
$ sudo add-apt-repository ppa:fcitx-team/nightly

更新软件源:

1
$ sudo apt-get update

安装 fcitx 输入法:

1
$ sudo apt-get install fcitx fcitx-config-gtk fcitx-googlepinyin fcitx-sogoupinyin

设置默认输入法:

1
$ im-config -s fcitx -z default

说明:Ubuntu 13.04 中设置默认输入法不再使用im-switch。

定制 Unity Launcher

如何在 Ubuntu Unity 桌面环境下定制 Unity Launcher?

Unity Launcher的定制,只需在/usr/share/glib-2.0/schemas/目录下新建一个com.canonical.Unity.gschema.override文件,并添加.desktop配置,操作如下:

1
$ echo "[com.canonical.Unity.Launcher]
favorites=['firefox.desktop', 'nautilus-home.desktop', 'libreoffice-writer.desktop']" > /usr/share/glib-2.0/schemas/com.canonical.Unity.gschema.override
1
$ glib-compile-schemas /usr/share/glib-2.0/schemas/

然后注销系统,即可。

参考资料:

如何编写兼容Qt4和Qt5的程序?

工程文件pro

在pro文件中增加

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

源文件

在源文件中使用宏条件编译,如:

1
2
3
4
5
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
#include <QtGui>
#else
#include <QtWidgets>
#endif