让QMainWindow也表现出QDialog的exec函数的特征

时间:2021-07-25 14:34:15

  前几天在做毕业设计项目的时候,使用的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++下也是同样的方法。