試用了一段時間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__() self.mdiArea = QtGui.QMdiArea() self.mdiArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded) self.mdiArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded) self.setCentralWidget(self.mdiArea)
中間兩個長行代碼顯然是設定滑動軌何時出現的。另外也看到了Qt MDI的構建模型, 先建立一個MDI地區,再設定主視窗的中心組件為它。
2.2 代碼
self.mdiArea.subWindowActivated.connect(self.updateMenus) self.windowMapper = QtCore.QSignalMapper(self) self.windowMapper.mapped[QtGui.QWidget].connect(self.setActiveSubWindow)
第一行:當子視窗被啟用後觸發updateMenus操作。
第二行:建立訊號映射器
第三行:綁定訊號映射到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)
4. 獲得子視窗列表
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)