试用了一段时间wxpython,想尝试一下pyQt,看看两者到底那个更好使些。网上赞pyQt的不少,应该也不是空穴来风,我看了几个pyQt的demo,的确很强大,虽然wxpython也不赖。更主要的原因是wxwidgets沿用MFC那套消息机制在python下看来有些繁琐,想试试Qt的signal-slot方式。
一、MDI - pyQt demo
1. 主窗口继承自QtGui.QMainWindow
2. 初始化过程 __init__(self):
2.1 代码
super(MainWindow, self).__init__()中间两个长行代码显然是设定滑动轨何时出现的。另外也看到了Qt MDI的构建模型, 先创建一个MDI区域,再设定主窗口的中心组件为它。
self.mdiArea = QtGui.QMdiArea()
self.mdiArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
self.mdiArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
self.setCentralWidget(self.mdiArea)
2.2 代码
self.mdiArea.subWindowActivated.connect(self.updateMenus)第一行:当子窗口被激活后触发updateMenus操作。
self.windowMapper = QtCore.QSignalMapper(self)
self.windowMapper.mapped[QtGui.QWidget].connect(self.setActiveSubWindow)
第二行:创建信号映射器
第三行:绑定信号映射到setActiveSubWindow函数,传入该函数的参数为QtGui.QWidget类型。
附加说明:
action.triggered.connect(self.windowMapper.map)
self.windowMapper.setMapping(action, window)
其中action为一个菜单项,window为子窗口对象。当点击一个菜单项触发操作时,会将触发者自身作为一个Key值,到windowMapper.map中查找Value值,这个Value就是窗口对象window,(是setMapping(action, window)将两者绑定成一个字典),再将window值传入由映射器绑定的统一处理函数setActiveSubWindow。
3. 添加子窗口
child = MdiChild()
self.mdiArea.addSubWindow(child)
windows = self.mdiArea.subWindowList()
5. 添加菜单项
self.fileMenu = self.menuBar().addMenu("&File")菜单子项为:
self.fileMenu.addAction(self.newAct)
self.fileMenu.addAction(self.openAct)
self.fileMenu.addAction(self.saveAct)
self.fileMenu.addAction(self.saveAsAct)
self.fileMenu.addSeparator()
self.newAct = QtGui.QAction(QtGui.QIcon(':/images/new.png'), "&New",
self, shortcut=QtGui.QKeySequence.New,
statusTip="Create a new file", triggered=self.newFile)