Linux下java 图形界面开发发,Python,Qt选哪一个好

PyQt是Python下的另一套图形界面接口库,顾名思义就是在Python中调用Qt图形库和组件。使用PyQt的优点在于可以使用Qt成熟的IDE(如Qt Creator)进行图形界面设计,并自动生成可执行的Python代码。
1.1.PyQt的安装和使用
PyQt可以通过apt-get命令安装,其对应Python 2.x 和Python 3.x的包名称不同。
安装Python 2.x下的PyQt:
$ sudo apt-get install python-pyqt4 pyqt4-dev-tools
安装Python 3.x下的PyQt:
$ sudo apt-get install python3-pyqt4 pyqt4-dev-tools
获取PyQt的文档和范例程序(非必须):
$ sudo apt-get install python-qt4-doc
获取到的范例程序保存在/usr/share/doc/python-qt4-doc/examples目录下找到。
对话框演示
FTP客户端(网络编程)演示
OpenGL 3D绘图
下面我们通过一段代码演示PyQt的使用。新建Python文件,命名为hello_pyqt.py,代码内容如下:
import sys
from PyQt4 import QtCore, QtGui
class HelloPyQt(QtGui.QWidget):
&&& def __init__(self, parent = None):
&&&&&&& super(HelloPyQt, self).__init__(parent)
&&&&&&& self.setWindowTitle(&PyQt Test&)
&&&&&&& self.textHello = QtGui.QTextEdit(&This is a test program written in python with PyQt lib!&)
&&&&&&& self.btnPress = QtGui.QPushButton(&Press me!&)
&&&&&&& layout = QtGui.QVBoxLayout()
&&&&&&& layout.addWidget(self.textHello)
&&&&&&& layout.addWidget(self.btnPress)&&&
&&&&&&& self.setLayout(layout)
&&&&&&& self.btnPress.clicked.connect(self.btnPress_Clicked)
&&& def btnPress_Clicked(self):
&&&&&&& self.textHello.setText(&Hello PyQt!\nThe button has been pressed.&)
if __name__=='__main__':
&&& app = QtGui.QApplication(sys.argv)
&&& mainWindow = HelloPyQt()
&&& mainWindow.show()
&&& sys.exit(app.exec_())
在本例中,所有的PyQt控件都封装在HelloPyQt类中。首先添加了一个QTextEdit 控件textHello和QPushButton控件btnPress,然后通过self.btnPress.clicked.connect()语句将btnPress按钮的clicked信号连接至btnPress_Clicked()函数。
如此当按钮被按下时,会触发clicked事件,进而调用btnPress_Clicked()函数。该函数的功能就是改变textHello中的文本。
在Python3下运行程序:
$ python3 hello_pyqt.py
PyQt程序运行效果
从上面的例子可以看出手动编写代码调用PyQt依然十分不便,好在PyQt还为我们准备了Qt GUI界面的转换工具,可以将Qt Creator生成的.ui文件直接转换成Python代码。比如需要对test.ui进行转换,其命令如下:
$ pyuic4 test.ui -x -o test.py
其中-x参数相当于--execute,在代码中增加了一些测试语句,这样生成的Python文件就可以直接执行了。之后我们就可以在生成的代码基础上实现自己的功能。
在Python借用Qt强大的图形控件
1.2.例:通过PyQt设计CPU温度监控软件
这里我们将通过PyQt设计一个监控树莓派内核温度的小软件。首先打开QtCreator,新建一个Qt GUI应用程序工程(如何在树莓派2本地安装运行Qt Creator,请参见:编程篇(一)在树莓派2上本地开发Qt GUI程序)。设计如下图所示的窗口界面:
在Qt Creator中设计GUI
通过pyuic命令将GUI文件转换成Python文件,然后在此基础上进行修改,代码如下:
from PyQt4 import QtCore, QtGui
&&& _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
&&& _fromUtf8 = lambda s: s
class Ui_HelloPyQt(object):
&&& def setupUi(self, HelloPyQt):
&&&&&&& HelloPyQt.setObjectName(_fromUtf8(&HelloPyQt&))
&&&&&&& HelloPyQt.resize(304, 212)
&&&&&&& self.centralWidget = QtGui.QWidget(HelloPyQt)
&&&&&&& self.centralWidget.setObjectName(_fromUtf8(&centralWidget&))
&&&&&&& self.lcdTemp = QtGui.QLCDNumber(self.centralWidget)
&&&&&&& self.lcdTemp.setGeometry(QtCore.QRect(40, 40, 221, 81))
&&&&&&& self.lcdTemp.setSmallDecimalPoint(False)
&&&&&&& self.lcdTemp.setDigitCount(6)
&&&&&&& self.lcdTemp.setObjectName(_fromUtf8(&lcdTemp&))
&&&&&&& self.sliderAlarm = QtGui.QSlider(self.centralWidget)
&&&&&&& self.sliderAlarm.setGeometry(QtCore.QRect(40, 170, 221, 16))
&&&&&&& self.sliderAlarm.setMaximum(120)
&&&&&&& self.sliderAlarm.setProperty(&value&, 80)
&&&&&&& self.sliderAlarm.setOrientation(QtCore.Qt.Horizontal)
&&&&&&& self.sliderAlarm.setTickPosition(QtGui.QSlider.NoTicks)
&&&&&&& self.sliderAlarm.setObjectName(_fromUtf8(&sliderAlarm&))
&&&&&&& self.labelAlarm = QtGui.QLabel(self.centralWidget)
&&&&&&& self.labelAlarm.setGeometry(QtCore.QRect(40, 150, 221, 16))
&&&&&&& self.labelAlarm.setObjectName(_fromUtf8(&labelAlarm&))
&&&&&&& self.labelTemp = QtGui.QLabel(self.centralWidget)
&&&&&&& self.labelTemp.setGeometry(QtCore.QRect(40, 20, 221, 16))
&&&&&&& self.labelTemp.setObjectName(_fromUtf8(&labelTemp&))
&&&&&&& #Add timer
&&&&&&& self.timerTemp = QtCore.QTimer(self.centralWidget)&&&&&&&
&&&&&&& HelloPyQt.setCentralWidget(self.centralWidget)&&&&&&&
&&&&&&& # Add slots
&&&&&&& self.sliderAlarm.valueChanged.connect(self.sliderAlarm_ValueChanged)
&&&&&&& self.timerTemp.timeout.connect(self.timerTemp_TimeOut)
&&&&&&& # Use the timeout event to initialize the LCD
&&&&&&& self.timerTemp_TimeOut()
&&&&&&& # Start timer, time out per 2 seconds
&&&&&&& self.timerTemp.start(2000)
&&&&&&& self.retranslateUi(HelloPyQt)
&&&&&&& QtCore.QMetaObject.connectSlotsByName(HelloPyQt)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&
&&& def retranslateUi(self, HelloPyQt):
&&&&&&& HelloPyQt.setWindowTitle(QtGui.QApplication.translate(&HelloPyQt&, &HelloPyQt&, None, QtGui.QApplication.UnicodeUTF8))
&&&&&&& self.labelAlarm.setText(QtGui.QApplication.translate(&HelloPyQt&, &Alarm: 80C&, None, QtGui.QApplication.UnicodeUTF8))
&&&&&&& self.labelTemp.setText(QtGui.QApplication.translate(&HelloPyQt&, &CPU Temperature&, None, QtGui.QApplication.UnicodeUTF8))
&&& # Event triggered when the value of labelAlarm changed
&&& def sliderAlarm_ValueChanged(self):
&&&&&&& self.labelAlarm.setText(&Alarm: & + str(self.sliderAlarm.value()) + &C&)
&&& # Event triggered when timerTemp time out
&&& def timerTemp_TimeOut(self):
&&&&&&& # Get temperature from sensor file
&&&&&&& sensor = os.popen(&cat /sys/class/thermal/thermal_zone0/temp&)
&&&&&&& temp = float(sensor.readline()) / 1000
&&&&&&& alarm = float(self.sliderAlarm.value())
&&&&&&& # Display temperature
&&&&&&& self.lcdTemp.display(&%.1fC& % temp)
&&&&&&& # Check whether the temperature is too high
&&&&&&& if temp &= alarm * 0.6:
&&&&&&&&&&& self.lcdTemp.setStyleSheet(&color: green&)
&&&&&&& elif temp &= alarm * 0.8:
&&&&&&&&&&& self.lcdTemp.setStyleSheet(&color: orange&)
&&&&&&& elif temp &= alarm:
&&&&&&&& &&&self.lcdTemp.setStyleSheet(&color: red&)
&&&&&&& else:
&&&&&&&&&&& self.lcdTemp.setStyleSheet(&color: red&)
&&&&&&&&&&& msg = QtGui.QMessageBox()
&&&&&&&&&&& msg.setWindowTitle(&Alarm&)
&&&&&&&&&&& msg.setText(&Temperature is too high!&)
&&&&&&&&&&& msg.setIcon(QtGui.QMessageBox.Warning)
&&&&&&&&&&& msg.exec_()
&&&&&&&&&&& # You can do something else here, like shut down the system
&&&&&&&&&&&
if __name__ == &__main__&:
&&& import sys
&&& app = QtGui.QApplication(sys.argv)
&&& HelloPyQt = QtGui.QMainWindow()
&&& ui = Ui_HelloPyQt()
&&& ui.setupUi(HelloPyQt)
&&& HelloPyQt.show()
sys.exit(app.exec_())
代码中新建了一个QTimer定时器控件,用于定时查询CPU当前的温度并更新显示。self.timerTemp.timeout.connect()语句将定时器的超时信号链接至timerTemp_TimeOut()函数。self.timerTemp.start(2000)设置定时器超时时间为200ms,即每2秒执行一次timerTemp_TimeOut()函数。
LCD控件用于显示CPU当前的温度。在显示界面和运行定时器之前,可以通过手动调用self.timerTemp_TimeOut()函数读取CPU温度来初始化LCD控件内容。
CPU的温度通过读取 /sys/class/thermal/thermal_zone0/temp文件内容获得。这里采用os.popen()方法在Linux Shell中通过cat命令读取文件,并将返回的字符串信息转换为数字显示在LCD控件中。
窗口下面的滚动条用于设置温度报警门限,如果CPU温度接近门限值,则会改变温度显示的颜色。如果超过门限值则弹出对话框报警。
温度监控程序运行效果
这里我们还可以使用一个小程序将CPU占用率提高到100%来提升CPU温度,只要编写一段死循环的运算代码即可(一个Python进程只能在单个内核上运行,对于树莓派2,需要同时启动4个进程才能跑满全部内核)。代码内容如下:
while True:
多进程后台执行:
$ python tst.py&
$ python tst.py&
$ python tst.py&
$ python tst.py&
提高CPU占用率
旗下网站:
与非门科技(北京)有限公司 All Rights Reserved.
京ICP证:070212号
北京市公安局备案编号: 京ICP备:号1938人阅读
Python(40)
本实例实现一个&Hello Kitty!&例子,简单介绍Qt编程的基本流程,以及Qt程序的编绎运行方式,实例效果图如图所示。
这是一个简单的例子,整个对话框只有一个按钮,单击该按钮,对话框关闭,退出程序。
实现代码如下:
from&PyQt4.QtGui&import&*&&from&PyQt4.QtCore&import&*&&import&sys&&&&app=QApplication(sys.argv)&&b=QPushButton(&Hello&Kitty!&)&&b.show()&&app.connect(b,SIGNAL(&clicked()&),app,SLOT(&quit()&))&&app.exec_()&&
第1行导入PyQt4.QtGui的所有类及模块,包括QApplication,所有Qt图形化应用程序都必须包含此文件,它包含了Qt图形化应用程序的各种资源,基本设置,控制流以及事件处理等。
第5行新创建了一个QApplication对象,每个Qt应用程序都必须有且只有一个QApplication对象,采用sys.argv作为参数,便于程序处理命令行参数。
第6行创建了一个QPushButton对象,并设置它的显示文本为“Hello Kitty!”,由于此处并没有指定按钮的父窗体,因此以自己作为主窗口。
第7行调用show()方法,显示此按钮。控件被创建时,默认是不显示的,必须调用show()函数来显示它。
第8行的connect方法是Qt最重要的特征,即信号与槽的机制。当按钮被按下则触发clicked信号,与之相连的QApplication对象的槽quit()响应按钮单击信号,执行退出应用程序的操作。关于信号与槽机制在本实例最后将进行详细的分析。
最后调用QApplication的exec_()方法,程序进入消息循环,等待可能输入进行响应。Qt完成事件处理及显示的工作,并在应用程序退出时返回exec_()的值。
最后执行程序即可出现上图所示的对话框,一个简单的Hello Kitty!例子完成。
信号与槽机制作为Qt最重要的特性,提供了任意两个Qt对象之间的通信机制。其中,信号会在某个特定情况或动作下被触发,槽是用于接收并处理信号的函数。例如,要将一个窗口中的变化情况通知给另一个窗口,则一个窗口发送信号,另一个窗口的槽接收此信号并进行相应的操作,即可实现两个窗口之间的通信。这比传统的图形化程序采用回调函数的方式实现对象间通信要简单灵活得多。每个Qt对象都包含预定的信号和槽,当一某一特定事件发生时,一个信号被发射,与信号相关联的槽则会响应信号完成相应的处理。
信号与槽机制常用的连接方式为:
connect(Object1,SIGNAL(signal),Object2,SLOT(slot))
signal为对象Object1的信号,slot为对象Object2的槽,Qt的窗口部件都包含若干个预定义的信号和若干个预定义的槽。当一个类被继承时,该类的信号和槽也同时被继承。开始人员也可以根据需要定义自己的信号和槽。
信号与槽机制可以有多种连接方式,下图描述了信号与槽的多种可能连接方式。
1.一个信号可以与另一个信号相连
connect(Object1,SIGNAL(signal1),Object2,SIGNAL(signal1))
即表示Object1的信号1发射可以触发Object2的信号1发射。
2.表示一个信号可以与多个槽相连
connect(Object1,SIGNAL(signal2),Object2,SLOT(slot2))
connect(Object1,SIGNAL(signal2),Object3,SLOT(slot1))
3.表示同一个槽可以响应多个信号
connect(Object1,SIGNAL(signal2),Object2,SLOT(slot2))
connect(Object3,SIGNAL(signal2),Object2,SLOT(slot2))&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:100412次
积分:2059
积分:2059
排名:第17500名
原创:123篇
转载:30篇
评论:96条
非技术类博客:.cn/qtluyixiao 个人邮箱: 个人运营公众号:请搜索:tebs
阅读:8938
阅读:2503
阅读:9447用PyQt进行Python图形界面的程序的开发的入门指引
投稿:goldensun
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了用PyQt进行Python图形界面的程序的开发的入门指引,来自于IBM官方网站技术文档,需要的朋友可以参考下
一般来说,选择用于应用程序的 GUI 工具箱会是一件棘手的事。使用 Python(许多语言也一样)的程序员可以选择的 GUI 工具箱种类繁多,而每个工具箱都有各自的优缺点。有些速度比其它工具箱快,有些比较小;有些易于安装,有些更适合于跨平台使用(对于这一点,还要指出,有些支持您需要满足的特定特性)。当然,各种库都相应具有各种许可证。
对于 Python 程序员而言,缺省的 GUI 选择是 Tk(通过 Tkinter 绑定)— 其原因显而易见。Tkinter 和闲置的 IDE 是由 Python 创始人编写的,它们是作为大多数 Python 分发版的缺省选择而出现的。标准 Python 文档讨论了 Tkinter,但没有涉及任何其它 GUI 绑定。这是故意的!至少可以这么认为,如果 Tk 和 Tkinter 不是这么糟糕,程序员就没有理由去寻找替代品了。要诱导 Python 程序员放弃缺省选择,那么工具箱必须提供额外的东西。PyQt 就是这样一个工具箱。
PyQt 所具有的优点远远超过了 Tkinter(它也有几个缺点)。Qt 和 PyQt 速度都很快;Qt 和 PyQt 的设计完全是面向对象的;Qt 提供了一个设计良好的窗口构件集合,它比 Tk 所提供的要大得多。就其缺点而言,Qt 的许可证受到的限制比许多工具箱(至少在非 Linux 平台方面)都多;正确安装 Qt 和 PyQt 常常会很复杂;另外,Qt 是一个相当大的库。PyQt 应用程序的用户将需要设法完成安装 Qt 和 PyQt,这使分发变得很困难。(请阅读本文后面的 用于其它语言的 Qt 绑定。)
PyQt 严格遵循 Qt 的发放许可。特别是,它可用于 UNIX/X11 平台上的 GPL,并可用于 Zaurus 上的 Qt Palmtop Environment 环境,还存在用于较老的 Qt 版本的免费(free-as-in-free-beer)Windows 软件包。PyQt 的商业许可证可用于 Windows。
对于本文而言,PyQt 有一个方面优于许多其它工具箱,它值得我们特别关注。Qt 使用一种称为 信号/插槽(signals/slots)的机制在窗口构件(以及其它对象)之间传递事件和消息。这种机制完全不同于包括 Tkinter 在内的大多数工具箱所用的回调(callback)机制。使用信号/插槽以灵活且可维护的方式控制对象间通信要比使用脆弱的回调风格容易得多。应用程序越大,Qt 的这个优势就越重要。
本文的作者之一 Boudewijn Rempt 已经出版了一本有关使用 PyQt 进行应用程序开发的书籍。 GUI Programming with Python: QT Edition(请参阅 参考资料)显示了如何设计和开发完整的 GUI 应用程序,其中包括从最初的构思到分发的全过程。
样本应用程序
要显示信号/插槽和回调之间的反差,我们提供了一个写着玩玩的应用程序,它使用 Tkinter 和 PyQt。尽管实际上 PyQt 版本对于这个基本程序并不更简单,但是它已经演示了 PyQt 应用程序更好的模块性和可维护性。
应用程序包括四个窗口构件:
&&& “Quit”按钮(用来与整个应用程序通信)
&&& “Log Timestamp”按钮(用于窗口构件间的消息)
&&& 文本区域,显示可滚动的已记录日志的时间戳记列表
&&& 消息窗口构件,显示已记录日志的时间戳记数
在 Tkinter 中,我们可以这样实现应用程序:
清单 1. Logger.py Tkinter 应用程序
#!/usr/bin/python
import sys, time
from Tkinter import *
class Logger(Frame):
def __init__(self):
Frame.__init__(self)
self.pack(expand=YES, fill=BOTH)
self.master.title("Timestamp logging application")
self.tslist = []
self.tsdisp = Text(height=6, width=25)
self.count = StringVar()
tdisp = Message(font=('Sans',24),
textvariable=self.count)
self.log = Button(text="Log Timestamp",
command=self.log_timestamp)
self.quit = Button(text="Quit", command=sys.exit)
self.tsdisp.pack(side=LEFT)
tdisp.pack()
self.log.pack(side=TOP, expand=YES, fill=BOTH)
self.quit.pack(side=BOTTOM, fill=BOTH)
def log_timestamp(self):
stamp = time.ctime()
self.tsdisp.insert(END, stamp+"\n")
self.tsdisp.see(END)
self.tslist.append(stamp)
self.count.set("% 3d" % len(self.tslist))
if __name__=='__main__':
Logger().mainloop()
这个 Tk 版本使用了 log_timestamp() 方法作为按钮的 command= 参数。 这个方法需要依次单独操作它要影响的所有窗口构件。如果我们想更改按钮按下的效果(例如还要记录时间戳记),那么这个风格就很脆弱。通过继承您可以实现这一点:
清单 2. StdOutLogger.py Tkinter 增强
class StdOutLogger(Logger):
def log_timestamp(self):
Logger.log_timestamp(self)
print self.tslist[-1]
但是这个子类的作者需要相当精确地理解 Logger.log_timestamp() 已经做了什么;而且除非通过在子类中完全重写 .log_timestamp() 方法并且不调用父方法,否则没有办法 除去消息。
一个非常基本的 PyQt 应用程序总有一些样本代码,这些代码在哪里都相同,Tkinter 代码也是这样。但是,当我们进一步研究设置应用程序所需的代码,以及显示窗口构件的代码时,区别就显现出来了。
清单 3. logger-qt.py PyQt 应用程序
#!/usr/bin/env python
import sys, time
from qt import * # Generally advertised as safe
class Logger(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
self.setCaption("Timestamp logging application")
self.layout = QGridLayout(self, 3, 2, 5, 10)
self.tsdisp = QTextEdit(self)
self.tsdisp.setMinimumSize(250, 300)
self.tsdisp.setTextFormat(Qt.PlainText)
self.tscount = QLabel("", self)
self.tscount.setFont(QFont("Sans", 24))
self.log = QPushButton("&Log Timestamp", self)
self.quit = QPushButton("&Quit", self)
self.layout.addMultiCellWidget(self.tsdisp, 0, 2, 0, 0)
self.layout.addWidget(self.tscount, 0, 1)
self.layout.addWidget(self.log, 1, 1)
self.layout.addWidget(self.quit, 2, 1)
self.connect(self.log, SIGNAL("clicked()"),
self.log_timestamp)
self.connect(self.quit, SIGNAL("clicked()"),
self.close)
def log_timestamp(self):
stamp = time.ctime()
self.tsdisp.append(stamp)
self.tscount.setText(str(self.tsdisp.lines()))
if __name__ == "__main__":
app = QApplication(sys.argv)
app.connect(app, SIGNAL('lastWindowClosed()'), app,
SLOT('quit()'))
logger = Logger()
logger.show()
app.setMainWidget(logger)
app.exec_loop()
通过创建布局管理器, Logger 类开始工作了。布局管理器在任何 GUI 系统中都是一个很复杂的主题,但是 Qt 的实现使之变得简单。在大多数情况下,您会使用 Qt Designer 创建一般的 GUI 设计,随后可将它用于生成 Python 或 C++ 代码。然后您可以使生成的代码生成子类,以添加功能。
但是在这个示例中,我们选择手工创建布局管理器。窗口构件被置于网格的各个单元中,或者可以跨多个单元放置。在 Tkinter 需要命名参数的地方,PyQt 就不允许它们。这是一个很重要的差异,它经常会使在两种环境中工作的人们无所适从。
所有 Qt 窗口构件都可以和 QString 对象很自然地一起工作,而不能和 Python 字符串或 Unicode 对象一起工作。幸运的是,转换是自动的。如果您在 Qt 方法中使用了字符串或 Unicode 参数,那么它将自动转换成 QString。不能进行反向转换:如果您调用了一个返回 QString 的方法,那么您获得的是 QString。
应用程序中最有趣的部分是我们将 clicked 信号连接到功能的位置。一个按钮连接到了 log_timestamp 方法;另一个连接到了 QWidget 类的 close 方法。
图 1. logger-qt 的屏幕快照
logger-qt 的屏幕快照
现在我们想将日志记录添加到这个应用程序的标准输出。 这十分容易。我们可以使 Logger 类生成子类,或者为了演示,创建简单的独立函数:
清单 4. logger-qt.py PyQt 增强
def logwrite():
print(time.ctime())
if __name__ == "__main__":
app = QApplication(sys.argv)
app.connect(app, SIGNAL('lastWindowClosed()'), app,
SLOT('quit()'))
logger = Logger()
QObject.connect(logger.log, SIGNAL("clicked()"), logwrite)
logger.show()
app.setMainWidget(logger)
app.exec_loop()
从上述代码我们可以看到,这就是将 log QPushButton 的 clicked() 信号连接到新函数的事情。注:信号也可以将任何数据传送到它们所连接的插槽,尽管在这里我们没有显示这样的示例。
如果您不想调用原始方法,那么可以从插槽 disconnect 信号,例如通过在 logger.show() 行之前添加以下行:
清单 5. logger-qt.py PyQt 增强
QObject.disconnect(logger.log, SIGNAL("clicked()"),
logger.log_timestamp)
现在将不再更新 GUI。
用于 Python 的其它 GUI 绑定
PyQt 在给定实例中可能不是很有用,可能是许可证状态问题,也可能是平台可用性问题(或者,可能因为再分发很困难,例如大小很大)。由于这个原因(也为了比较),我们想指出一些用于 Python 的其它流行 GUI 工具箱。
&&& Anygui
&&& Anygui 实际上不是 GUI 工具箱,而是一个作用于大量工具箱(甚至是令人惊奇的象 curses 和 Java/Jython Swing 那样的工具箱)的抽象包装器。在编程风格方面,使用 Anygui 类似于使用 Tkinter,但是要选中这个底层工具箱,要么自动进行,要么进行配置调用。Anygui 很好用,因为它允许应用程序未经更改就可以运行在差异很大的平台上(但因此它支持受支持工具箱的“最低级公共特性”)。
&&& PyGTK 绑定包装了 GPL 下使用的 GTK 工具箱,它是流行的 Gnome 环境的基础。GTK 在根本上是 X Window 工具箱,但是它还有 Win32 的 beta 级支持和 BeOS 的 alpha 级支持。在常规范例中,PyGTK 对窗口构件使用回调。绑定存在于 GTK 和 大量编程语言之间,而不仅仅是 Qt,或甚至是 Tk。
&&& Python 绑定 FXPy 包装了 FOX 工具箱。FOX 工具箱已经被移植到大多数类 UNIX 平台上,以及 Win32 上。 与大多数工具箱类似,FOX 和 FXPy 都使用回调范例。FOX 由 LGPL 特许。
&&& wxPython
&&& 这个绑定包装了 wxWindows 工具箱。 与 FOX 或 GTK 类似,wxWindows 被移植到 Win32 和类 UNIX 平台上(但是没有移植到 MacOS、OS/2、BeOS 或其它“次要”平台上 — 尽管它对 MacOSX 的支持是 alpha 级的)。在范例方面,wxPython 接近回调风格。wxPython 对继承结构的关注程度高于大多数其它工具箱,而且它使用“事件”,而不是回调。但是本质上,事件仍旧被连接到单个方法上,随后可能需要作用于各种窗口构件。
&&& win32ui
&&& win32ui 属于 win32all 软件包,它包装了 MFC 类。很显然,这个工具箱是特定于 Win32 的库。MFC 实际上不只是 GUI 工具箱,它还使用各种范例的混合。对于想创建 Windows 应用程序的读者而言,与其它工具箱相比,win32ui 会让您“更接近于实质”。
从其它语言使用 Qt
如同 Python,从大量其它编程语言使用 Qt 工具箱是可能的。如果可以自由选择,我们会首选 Python,而不是其它语言。诸如公司政策以及与其它代码库连接之类的外部约束可以决定编程语言的选择。Qt 的原始语言是 C++,但也有用于 C、Java、Perl 和 Ruby 的绑定。就与 Python 示例的比较而言,让我们讨论一下用 Ruby 和 Java 写着玩玩的应用程序。
Ruby/Qt 在用法上十分类似于 PyQt。这两种语言具有相似的动态性和简明性,所以除了拼写上的差别外,其代码很类似:
清单 6. HelloWorld.rb Qt2 应用程序
#!/usr/local/bin/ruby
require 'qt2'
include Qt2
a = QApplication.new([$0] + ARGV)
hello = QPushButton.new('Hello world!')
hello.resize(100, 30)
a.connect( hello, QSIGNAL('clicked()'), a, QSLOT('quit()'))
a.setMainWidget(hello)
hello.show
Java 总是比脚本编制语言要冗长一点,但是基本部分都相同。一个同等功能的最小 qtjava 应用程序类似于:
清单 7. HelloWorld.java Qt2 应用程序
import org.kde.qt.*;
public class HelloWorld {
public static void main(String[] args)
QApplication myapp = new QApplication(args);
QPushButton hello = new QPushButton("Hello World", null);
hello.resize(100,30);
myapp.connect(hello, SIGNAL("clicked"),
this, SLOT("quit()"));
myapp.setMainWidget(hello);
hello.show();
myapp.exec();
System.loadLibrary("qtjava");
Class c = Class.forName("org.kde.qt.qtjava");
} catch (Exception e) {
System.out.println("Can't load qtjava class");
PyQt 是一个吸引人和快速的接口,它将 Qt 工具箱和 Python 编程语言集成在一起。除了该工具箱提供的种类繁多的窗口构件外,Qt 所用的信号/插槽编程风格在生产能力和可维护性方面都要优于大多数其它 GUI 工具箱所用的回调风格。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 java 图形界面开发 的文章

 

随机推荐