https://bugs.kde.org/show_bug.cgi?id=232054
就是这玩意啦,多半Dolphin卡死就是这个bug(恐怕吧),喂,不把这玩意修好可别发布KDE 4.5啊!
https://bugs.kde.org/show_bug.cgi?id=232054
就是这玩意啦,多半Dolphin卡死就是这个bug(恐怕吧),喂,不把这玩意修好可别发布KDE 4.5啊!
其实是专门为右京样一兄所作,搞了一个非常简单的窗口。闲话少说,我们来看看这个东西。
内容物很简单。
.
├── build.py
├── demowindow.py
├── main.pyw
└── ui
└── demowindow.ui
首先需要运行./build.py根据ui文件生成一个py文件,然后./main.pyw就可以运行了。内容也超少,首先是main.pyw的内容:
#!/usr/bin/env python
import sys
from PyQt4.QtGui import QApplication
from demowindow import DemoWindow
from PyQt4.QtCore import Qt, SIGNAL
if __name__ == "__main__":
app = QApplication(sys.argv);
app.connect( app, SIGNAL( "lastWindowClosed()" ), app.quit);
demowindow = DemoWindow()
demowindow.show()
sys.exit(app.exec_())
原理很简单,实例化一个QApplication对象(Qt程序都需要),设置一个signal,表示所有窗口退出后程序退出。
然后实例化了一个我们用Qt Designer创建的窗口,并显示。
然后是demowindow.py的内容:
from PyQt4.QtCore import Qt, SIGNAL
from PyQt4.QtGui import *
from ui_demowindow import Ui_DemoWindow
class DemoWindow(QWidget, Ui_DemoWindow):
def __init__(self, parent = None):
QWidget.__init__(self,parent)
self.setupUi(self)
self.connect(self.testButton, SIGNAL("clicked()"), self.test)
self.connect(self.exitButton, SIGNAL("clicked()"), self.exit)
def test(self):
self.helloLabel.setText("abc");
def exit(self):
self.close()
内容依旧简单明了,主要就是处理按钮事件,按下Test就会把显示的文字改成abc,按下Exit就是退出。初始化函数的惯例就是需要调用setupUi,这个函数相当于处理了界面的构建。那么原理是什么样子的呢?首先我们创建了一个ui文件(利用qt designer,涂涂画画什么的,最简单了,layout得自己玩玩才搞得明白)。然后利用pyuic4这个程序将ui文件转换为python代码pyuic4 -o ui_demowindow.py ui/demowindow.ui,这里这个python文件中会定义一个类Ui_classname,这个class name就是ui文件中顶级widget的名字(区分大小写)。然后一般都是利用定义一个新类继承Ui_类,和对应的Widget类型。然后在初始化的时候调用setupUi(self)初始化界面。
然后解释一下Qt的消息处理机制(个人理解),Qt的消息分为SLOT和SIGNAL,关联SIGNAL和SLOT称为connect。SIGNAL相当于一个事件,例如
self.connect(self.testButton, SIGNAL("clicked()"), self.test)
这是什么意思呢?就是在self.testButton这个按钮产生clicked的SIGNAL时,调用test这个函数。connect就是将这个信号和SLOT(test)关联起来。
P.S. 吐槽:右京样一兄你的blog没有trackback吗?还是你的主题不支持trackback链接……我本来想trackback一下你的原始文呢。
P.S.的P.S. 我猜出trackback链接了……
参考资料:
http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html
http://diotavelli.net/PyQtWiki/Creating_GUI_Applications_with_PyQt_and_Qt_Designer
http://www.linuxsir.org/bbs/thread370605.html
(注:hurricanek就是我啦)
被吐槽了!
说起来呢,当时搞这个分支,实在是因为64位系统的bug调不了,脑袋一热就建立分支了(编码转换时有bug)。不过后来就渐渐演变成这个分支变成未来的方向了呢?当然不是我独断专行,后来和yuking都讨论过这个问题。以下代表个人意见
那么,fcitx将变成什么样子呢?小而轻便,为所有桌面服务,这是会不变的。其他的呢?
更好的拼音支持,这是一定要做的。解决gtk程序的问题,这也是要做的。为了轻便难道要说:哥们,fcitx就是在firefox下面输入有问题,你有意见吗?这不可能。国际化,可以不做,可是面对着中文就有那么多locale,起码要对gb2312的用户和utf8的用户同时负责吧,况且也不难(甚至已经做出来了……)。
为了轻便,fcitx已经舍弃了很多。在字体问题上,我本来犹豫着是否要用pango来做字体处理(因为这样才能够保证当前字体不存在某个字符的情况有其他字体接替),cairo做不到这个。但是我看到pango依赖glib时我毅然抛弃了pango。fcitx为什么有字体问题?因为实在是国际化的字体支持是在更高层次做的啊。
xlib->cairo->pango,为了字体而重复发明轮子吗?怎么可能。(如果有人知道用cairo或者其他什么其他底层库可以实现一段文字不同字体(自动顶替字体中没有的字符),请赐教)所以我才用了很dirty的fontconfig workaround,有些人说字体奇怪,但是起码不是方块了吧。看到方块,有些人可能就会抛弃了。但是如果起码是中文,别人也许还能有些留下的余地。
fcitx真的并没有变得臃肿,将来核心也不会变,但是会给人更多选择。我觉得,开源的魅力就在于给你更多选择。
(其实我还想着做fcitx python绑定,方便开发插件呢……如同google pinyin的lua绑定一样……输入法做程序启动器什么的,嗯,将来也许fcitx就能表示毫无压力了。)
Qt的Color Scheme相比GTK来说(我也写过gtkrc),实在是一个不错的功能,同样的UI方便换颜色,就不用纠结那么多个gtk theme了。
有些KDE-Look的Color Scheme我实在难以理解,不知是否真的有人用,我们从最高评分看一看,评价前10个,再评价一下实用性。(主要是太多瞎我狗眼的配色了),
排名第一是个主题包,跳过。
Ice lilac,预览凭借出色的图标吸引眼球,灰色系,和默认Plasma主题不是很搭配。保护视力。
LightBlue,淡蓝色主题,亮色,有些晃眼……
Balance by LMolr,黑色系,比较好心的把文本框选择成灰色底色,不会使得浏览器太尴尬。但黑色系兼容性始终较差。
Kamelayon,绿色系,搭配能力差一些,openSUSE也许更搭。对于蓝色系(KDE默认,Fedora,Kubuntu)来说,似乎不是那么协调。
Neon Color Scheme by FRUiT,Neon是一个不错的仿霓虹灯的Plasma主题,但是把这玩意搞到Color Scheme上可不是什么好点子,这个颜色绝对会使狗眼一瞎,尤其是浏览器。
Black,还算不错,颜色偏暗淡,怀旧风。
DeepBlueGold,老外都喜欢深色主题,可是不把输入框底色搞成白色到了浏览器里面智能瞎狗眼。
LuckyEyes,一般,我个人不喜欢暗色。
Produkt Color Scheme,暗色,由于同样理由,瞎狗眼。
Ghost Color Scheme,依旧瞎眼。
总结,前十名暗色占了多数,但是不是白色底框的暗色系主题都会看不见文字或者和浏览器极度不协调。黑色按钮在浏览器里面也不是一个好主意,但是可以忍。不知道评分那么高,那些人都日常使用吗?……
最后来几个个人推荐:
Gentle,有些太灰,建议自己改造文本框。
Glacier 不错,比自带的Chrome明亮。
自带Oxygen,兼容性好,容易和GTK和firefox合作。
一个小技巧就是,Oxygen虽然是蓝色,不过不喜欢蓝色, 可以只修改高亮颜色,这样能保证firefox背景色统一的同时,又调换了颜色,一举两得。