在 Qt中,目前我认为做的最好的两种机制就是:SIGNAL and SLOTS和 Actions and
Key Sequences。
Actions and Key Sequence我对他的理解就是各种动作带来的核心一致反应。举个例子:
上面程序的目的就是:要让点击菜单 new,Ctrl+N,点击工具栏 new按钮三种 action都执行命令fileNew()。
比如我们在应用程序中常见的“新建文件”这一功能,他的实现可以通过下面几种方式:
1.点击菜单:File->New菜单项
2.点击工具栏:new的图标
3.键盘快捷方式:如 Ctrl+N
上面的这三种 actions,其实带来的结果(Sequence)是一样的,就是新建文件,那么在程序中如何做到三者的统一和同步,Qt给了很好的解决方法。在 PyQt中,它把类似上面的 actions封装(encapsulates)到一个 Qaction的 class中,下面举个例子:(windows环境下)
#!/usr/bin/env python
#coding=utf-8
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MainWindow(QMainWindow):
def __init__(self,parent=None):
super(MainWindow,self).__init__(parent)
#新建一个工具栏部件,添加照片并关联功能为New
fileNewAction=QAction(QIcon("./images/filenew.png"),"&New",self)
#设置快捷键,QKeySequence.New相当于ctrl+n
fileNewAction.setShortcut(QKeySequence.New)
helpText = "Create a new file"
#为工具栏部件设置状态信息
fileNewAction.setToolTip(helpText)
fileNewAction.setStatusTip(helpText)
#SIGNAL("triggered()")与SIGNAL("click()")差不多,但是还可以通过出左点击鼠标外的方式激活triggered
self.connect(fileNewAction,SIGNAL("triggered()"),self.fileNew)
#新建一个菜单栏部件
self.fileMenu = self.menuBar().addMenu("&file")
self.fileMenu.addAction(fileNewAction)
#创建工具栏
filetoolbar = self.addToolBar("file")
filetoolbar.addAction(fileNewAction)
#新建一个状态栏部件
self.status = self.statusBar()
self.status.showMessage("This is StatusBar",5000)
self.setWindowTitle("PyQt MianWindow")
def fileNew(self):
self.status.showMessage("You have created a newfile!",9000)
def main():
app = QApplication(sys.argv)
app.setApplicationName("PyQt MianWindow")
app.setWindowIcon(QIcon("./images/icon.png"))
form = MainWindow()
form.show()
app.exec_()
main()
运行结果入下:
其中红色部分就是 Qaction部分,其中的 QKeySequence.New就是基本多平台都统一使用的新建的响应快捷键 Ctrl+N,如果我们需要的快捷键没有,那么我们可以自己设置,就是填写快捷键的名称比如: fileNewAction.setShortcut(“Ctrl+N”)。把这个action都给了菜单 new和工具栏,通过 connect绑定,他们都执行同一响应。
一句话搞定。QKeySequence.New也可以用”Ctrl+n”代替