前几天在做毕业设计项目的时候,使用的PyQt4,想实现这么样一个功能:
场景描述:主窗口a(QMainWindow类型)和主窗口b(QMainWindow),b是通过a窗口中某一个按钮弹出来的。
功能:b窗口弹出来之后a窗口不能进行任何操作
实现方法:
用过Qt的同学应该很清楚,如果是QDialog类型的话,这个功能是很容易实现的,只需要通过QDialog的exec函数就可以阻塞原窗口,但是QMainWindow是没有这样的函数的,但是我们可以怎样实现呢?
方法1:重现QMainWindow的实现函数,增加一个exec函数(这个需要使用者对Qt的实现很熟悉,门槛相对来说比较高)
方法2:学过window GUI编程的人应该知道窗口有两种类型:模态和非模态,简单点来讲:模态窗口就是指当前的窗口不关闭之前,其他窗口就会阻塞,不能进行任何操作,类似于:打开文件,保存文件窗口;而非模态就没有这样的限制了。
好了,既然知道了这个概念就不难实现了,Qt中也提供了相应的函数来实现模态和非模态窗口的定义,具体只需要在构造函数中加入下面的函数就可以了: self.setWindowModality(QtCore.Qt.ApplicationModal);
#设置窗口为模态窗口
self.setWindowModality(QtCore.Qt.ApplicationModal);
这样就可以实现了。是不是很简单?当然,一般QMainWindow都会加上下面这个函数:
self.setAttribute(QtCore.Qt.WA_DeleteOnClose);
C++下也是同样的方法。