pyQt 例程学习 -1-

时间:2022-10-16 07:12:52

试用了一段时间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)