PyQt之最小化子窗口隐藏问题

问题:在Qt中,顶级窗口最小化后显示在任务栏上,子窗口最小化后显示在屏幕左下角。顶级窗口可以通过系统托盘等手段取消在任务栏上显示,而设置子窗口显示与隐藏时,需要取消子窗口最小化在左下角的显示。

解决方案(以打开一个数字时钟子窗口,显示并隐藏它为例):

1.参照PyQt中的DigitalClock(数字时钟)Demo,创建子窗口类

 1 class DigitalClock(QtGui.QLCDNumber):
2 '''数字时钟'''
3 ######################################## 构造、析构函数 ###################################
4 def __init__(self, parent=None):
5 '''构造函数'''
6 # 调用父类构造函数
7 super(DigitalClock, self).__init__(parent)
8 # 设置窗口标记
9 self.setWindowFlags(QtCore.Qt.Window)
10 # 设置窗口标题
11 self.setWindowTitle("Digital Clock")
12 # 设置窗口尺寸
13 self.resize(150, 60)
14 # 设置数字显示风格
15 self.setSegmentStyle(QtGui.QLCDNumber.Filled)
16 # 声明QTimer变量
17 timer = QtCore.QTimer(self)
18 # 延时连接槽函数
19 timer.timeout.connect(self.showTime)
20 # 间隔1秒
21 timer.start(1000)
22 # 显示时间
23 self.showTime()
24 ######################################### 命令 ############################################
25 def showTime(self):
26 '''显示时间'''
27 # 得到当前时间
28 time = QtCore.QTime.currentTime()
29 # 转换成QString
30 text = time.toString('hh:mm')
31 if (time.second() % 2) == 0:
32 text = text[:2] + ' ' + text[3:]
33 # 显示时间
34 self.display(text)

2.创建主窗口(示例为说明子窗口最小化隐藏问题,并未处理单实例与显示或隐藏按钮在子窗口关闭后能继续打开等问题)

 1 class MyWindow(QtGui.QWidget):
2 '''自定义窗口类'''
3 ######################################### 构造、析构函数 ################################
4 def __init__(self,parent = None):
5 '''构造函数'''
6 # 调用父类构造函数
7 super(MyWindow,self).__init__(parent)
8 # 设置窗口最小尺寸
9 self.setMinimumSize(400,200)
10 # 创建主控件
11 bodyWidget = QtGui.QWidget(self)
12 # 创建主布局
13 mainLayout = QtGui.QHBoxLayout(bodyWidget)
14 # 设置间距
15 mainLayout.setMargin(100)
16 # 创建按钮
17 digitalClockButton = QtGui.QPushButton("打开数字时钟")
18 showOrHideButton = QtGui.QPushButton("显示/隐藏")
19 # 设置按钮连接槽函数
20 digitalClockButton.clicked.connect(self.AddDigitalClock)
21 showOrHideButton.clicked.connect(self.showOrHideWindow)
22 # 添加按钮
23 mainLayout.addWidget(digitalClockButton)
24 mainLayout.addWidget(showOrHideButton)
25 ######################################### 命令 ############################################
26 def AddDigitalClock(self):
27 '''添加数字时钟'''
28 # 创建电子时钟
29 self.m_aDigitalClock = DigitalClock(self)
30 # 显示
31 self.m_aDigitalClock.show()
32
33 def showOrHideWindow(self):
34 '''显示或隐藏窗口'''
35 # 判断是否打开数字时钟
36 if hasattr(self,'m_aDigitalClock'):
37 # 设置隐藏
38 if self.m_aDigitalClock.isVisible():
39 self.m_aDigitalClock.setVisible(False)
40 # 设置显示
41 else:
42 self.m_aDigitalClock.setVisible(True)
43 # 判断窗口是否有QtCore.Qt.Tool
44 if self.m_aDigitalClock.windowType() == QtCore.Qt.Tool:
45 # 设置窗口标记(包含最大化、最小化按钮)
46 self.m_aDigitalClock.setWindowFlags(QtCore.Qt.Window)
47 # 显示
48 self.m_aDigitalClock.show()

3.此时子窗口最小化显示效果如下图


4.解决办法:

  4.1.覆盖数字时钟类的状态改变事件,拦截最小化状态,设置窗口标记为QtCore.Qt.Tool

1 def changeEvent(self,event):
2 '''改变事件'''
3 # 判断是否为最小化事件
4 if event.type() == QtCore.QEvent.WindowStateChange and self.isMinimized():
5   # 设置隐藏
6 self.setVisible(False)
7 # 设置窗口标记(取消在左下角显示)
8 self.setWindowFlags(QtCore.Qt.Tool)

  4.2.在主窗口类中设置显示时,判断有QtCore.Qt.Tool窗口标记,设置窗口标记为QtCore.Qt.Window,并显示调用show函数

 1 def showOrHideWindow(self):
2 '''显示或隐藏窗口'''
3 # 判断是否打开数字时钟
4 if hasattr(self,'m_aDigitalClock'):
5 # 设置隐藏
6 if self.m_aDigitalClock.isVisible():
7    self.m_aDigitalClock.setVisible(False)
8 # 设置显示
9 else:
10 self.m_aDigitalClock.setVisible(True)
11    # 判断窗口是否有QtCore.Qt.Tool
12    if self.m_aDigitalClock.windowType() == QtCore.Qt.Tool:
13   # 设置窗口标记(包含最大化、最小化按钮)
14   self.m_aDigitalClock.setWindowFlags(QtCore.Qt.Window)
15 # 显示
16 self.m_aDigitalClock.show()


5.完整示例代码如下(同2说明)

  1 # coding=gbk
2
3 # 导入模块
4 import sys
5 from PyQt4 import QtGui,QtCore
6
7 ############################################## 自定义窗口类 #################################
8 class MyWindow(QtGui.QWidget):
9 '''自定义窗口类'''
10 ######################################### 构造、析构函数 ################################
11 def __init__(self,parent = None):
12 '''构造函数'''
13 # 调用父类构造函数
14 super(MyWindow,self).__init__(parent)
15 # 设置窗口最小尺寸
16 self.setMinimumSize(400,200)
17 # 创建主控件
18 bodyWidget = QtGui.QWidget(self)
19 # 创建主布局
20 mainLayout = QtGui.QHBoxLayout(bodyWidget)
21 # 设置间距
22 mainLayout.setMargin(100)
23 # 创建按钮
24 digitalClockButton = QtGui.QPushButton("打开数字时钟")
25 showOrHideButton = QtGui.QPushButton("显示/隐藏")
26 # 设置按钮连接槽函数
27 digitalClockButton.clicked.connect(self.AddDigitalClock)
28 showOrHideButton.clicked.connect(self.showOrHideWindow)
29 # 添加按钮
30 mainLayout.addWidget(digitalClockButton)
31 mainLayout.addWidget(showOrHideButton)
32 ######################################### 命令 ############################################
33 def AddDigitalClock(self):
34 '''添加数字时钟'''
35 # 创建电子时钟
36 self.m_aDigitalClock = DigitalClock(self)
37 # 显示
38 self.m_aDigitalClock.show()
39
40 def showOrHideWindow(self):
41 '''显示或隐藏窗口'''
42 # 判断是否打开数字时钟
43 if hasattr(self,'m_aDigitalClock'):
44 # 设置隐藏
45 if self.m_aDigitalClock.isVisible():
46 self.m_aDigitalClock.setVisible(False)
47 # 设置显示
48 else:
49 self.m_aDigitalClock.setVisible(True)
50 # 判断窗口是否有QtCore.Qt.Tool
51 if self.m_aDigitalClock.windowType() == QtCore.Qt.Tool:
52 # 设置窗口标记(包含最大化、最小化按钮)
53 self.m_aDigitalClock.setWindowFlags(QtCore.Qt.Window)
54 # 显示
55 self.m_aDigitalClock.show()
56
57 ############################################# 数字时钟类 ######################################
58 class DigitalClock(QtGui.QLCDNumber):
59 '''数字时钟'''
60 ######################################## 构造、析构函数 ###################################
61 def __init__(self, parent=None):
62 '''构造函数'''
63 # 调用父类构造函数
64 super(DigitalClock, self).__init__(parent)
65 # 设置窗口标记
66 self.setWindowFlags(QtCore.Qt.Window)
67 # 设置窗口标题
68 self.setWindowTitle("Digital Clock")
69 # 设置窗口尺寸
70 self.resize(150, 60)
71 # 设置数字显示风格
72 self.setSegmentStyle(QtGui.QLCDNumber.Filled)
73 # 声明QTimer变量
74 timer = QtCore.QTimer(self)
75 # 延时连接槽函数
76 timer.timeout.connect(self.showTime)
77 # 间隔1秒
78 timer.start(1000)
79 # 显示时间
80 self.showTime()
81 ######################################### 命令 ############################################
82 def showTime(self):
83 '''显示时间'''
84 # 得到当前时间
85 time = QtCore.QTime.currentTime()
86 # 转换成QString
87 text = time.toString('hh:mm')
88 if (time.second() % 2) == 0:
89 text = text[:2] + ' ' + text[3:]
90 # 显示时间
91 self.display(text)
92 ######################################### 事件 ############################################
93 def changeEvent(self,event):
94 '''改变事件'''
95 # 判断是否为最小化事件
96 if event.type() == QtCore.QEvent.WindowStateChange and self.isMinimized():
97 # 设置隐藏
98 self.setVisible(False)
99 # 设置窗口标记(取消在左下角显示)
100 self.setWindowFlags(QtCore.Qt.Tool)
101
102 ############################################# 主函数 #########################################
103 if __name__ == "__main__":
104 '''主函数'''
105 # 声明变量
106 app = QtGui.QApplication(sys.argv)
107 # 创建窗口
108 window = MyWindow()
109 # 显示窗口
110 window.show()
111 # 应用程序事件循环
112 sys.exit(app.exec_())




 

posted on 2011-09-20 17:14  会说话的哑巴  阅读(4961)  评论(0编辑  收藏  举报