最近做个软件,用PyQT写的,在实现菜单栏点击弹出新窗口的时候严重被卡壳,发现用WxPython的思想和方式来做完全无法实现。PyQT的中文资料实在是太少了。看了点英文资料和QT的资料,逆推PyQT的实现方法,总算搞定。下面是一个小demo。
主界面的代码如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
# -*- coding: utf-8 -*- from PyQt4 import QtCore, QtGui from dialog1 import Dialog1 from dialog2 import Dialog2 import sys try : _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s try : _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig) class MainWindow(QtGui.QWidget): dialog1_signal = QtCore.pyqtSignal() #定义一个无参数的信号,串口设定与子站初始化信号 dialog2_signal = QtCore.pyqtSignal() #定义一个无参数的信号,串口设定与子站初始化信号 exit_signal = QtCore.pyqtSignal() #定义一个无参数的信号,串口设定与子站初始化信号 def __init__( self ): super (MainWindow, self ).__init__() def setupUi( self , Form): Form.setObjectName(_fromUtf8( "Form" )) Form.resize( 400 , 300 ) self .form = Form self .pushButton = QtGui.QPushButton(Form) self .pushButton.setGeometry(QtCore.QRect( 70 , 90 , 75 , 23 )) self .pushButton.setObjectName(_fromUtf8( "pushButton" )) self .pushButton_2 = QtGui.QPushButton(Form) self .pushButton_2.setGeometry(QtCore.QRect( 240 , 90 , 75 , 23 )) self .pushButton_2.setObjectName(_fromUtf8( "pushButton_2" )) self .pushButton_3 = QtGui.QPushButton(Form) self .pushButton_3.setGeometry(QtCore.QRect( 150 , 160 , 75 , 23 )) self .pushButton_3.setObjectName(_fromUtf8( "pushButton_3" )) self .label = QtGui.QLabel(Form) self .label.setGeometry(QtCore.QRect( 170 , 40 , 54 , 16 )) self .label.setObjectName(_fromUtf8( "label" )) self .retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) #信号连接到指定槽 self .pushButton.clicked.connect( self .on_pushButton_clicked) self .pushButton_2.clicked.connect( self .on_pushButton_2_clicked) self .pushButton_3.clicked.connect( self .on_pushButton_3_clicked) def retranslateUi( self , Form): Form.setWindowTitle(_translate( "Form" , "Form" , None )) self .pushButton.setText(_translate( "Form" , "进入dialog1" , None )) self .pushButton_2.setText(_translate( "Form" , "进入dialog2" , None )) self .pushButton_3.setText(_translate( "Form" , "退出" , None )) self .label.setText(_translate( "Form" , "主窗体" , None )) def on_pushButton_clicked( self ): self .form.hide() Form1 = QtGui.QDialog() ui = Dialog1() ui.setupUi(Form1) Form1.show() Form1.exec_() self .form.show() def on_pushButton_3_clicked( self , Form): #QtCore.QObject.connect( self.pushButton_3, QtCore.SIGNAL("clicked()"), self, QtCore.SLOT(quit())) #也可以这样 self .form.close() def on_pushButton_2_clicked( self ): self .form.close() Form1 = QtGui.QDialog() ui = Dialog2() ui.setupUi(Form1) Form1.show() Form1.exec_() self .form.show() if __name__ = = '__main__' : app = QtGui.QApplication(sys.argv) Form = QtGui.QWidget() window = MainWindow() window.setupUi(Form) Form.show() sys.exit(app.exec_()) pass |
Dialog1界面的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
# -*- coding: utf-8 -*- from PyQt4 import QtCore, QtGui try : _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s try : _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig) class Dialog1(QtGui.QWidget): def setupUi( self , Dialog): Dialog.setObjectName(_fromUtf8( "Dialog" )) Dialog.resize( 400 , 300 ) self .form = Dialog self .label = QtGui.QLabel(Dialog) self .label.setGeometry(QtCore.QRect( 180 , 50 , 54 , 12 )) self .label.setObjectName(_fromUtf8( "label" )) self .dialog1_pushButton = QtGui.QPushButton(Dialog) self .dialog1_pushButton.setGeometry(QtCore.QRect( 160 , 130 , 75 , 23 )) self .dialog1_pushButton.setObjectName(_fromUtf8( "pushButton" )) self .retranslateUi(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog) #信号连接到指定槽 self .dialog1_pushButton.clicked.connect( self .on_dialog1_pushButton_clicked) def retranslateUi( self , Dialog): Dialog.setWindowTitle(_translate( "Dialog" , "Dialog" , None )) self .label.setText(_translate( "Dialog" , "dialog1" , None )) self .dialog1_pushButton.setText(_translate( "Dialog" , "返回主窗体" , None )) def on_dialog1_pushButton_clicked( self ): self .form.close() if __name__ = = "__main__" : import sys app = QtGui.QApplication(sys.argv) Dialog = QtGui.QDialog() ui = Dialog1() ui.setupUi(Dialog) Dialog.show() sys.exit(app.exec_()) Dialog2界面的代码如下: [python] view plain copy # -*- coding: utf-8 -*- from PyQt4 import QtCore, QtGui try : _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s try : _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig) class Dialog2( object ): def setupUi( self , Dialog): Dialog.setObjectName(_fromUtf8( "Dialog" )) Dialog.resize( 400 , 300 ) self .form = Dialog self .label = QtGui.QLabel(Dialog) self .label.setGeometry(QtCore.QRect( 180 , 60 , 54 , 12 )) self .label.setObjectName(_fromUtf8( "label" )) self .pushButton = QtGui.QPushButton(Dialog) self .pushButton.setGeometry(QtCore.QRect( 160 , 140 , 75 , 23 )) self .pushButton.setObjectName(_fromUtf8( "pushButton" )) self .retranslateUi(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog) #信号连接到指定槽 self .pushButton.clicked.connect( self .on_pushButton_clicked) def retranslateUi( self , Dialog): Dialog.setWindowTitle(_translate( "Dialog" , "Dialog" , None )) self .label.setText(_translate( "Dialog" , "dialog2" , None )) self .pushButton.setText(_translate( "Dialog" , "返回主窗体" , None )) def on_pushButton_clicked( self ): self .form .close() if __name__ = = "__main__" : import sys app = QtGui.QApplication(sys.argv) Dialog = QtGui.QDialog() ui = Dialog2() ui.setupUi(Dialog) Dialog.show() sys.exit(app.exec_()) |
按钮绑定到新弹出界面的处理函数,使用的槽连接方式为:
1
|
self .pushButton.clicked.connect( self .on_pushButton_clicked) |
如果是Menu项绑定到新弹出界面的处理函数,则应使用的槽连接方式为:
1
|
QtCore.QObject.connect( self .set_value_menu, QtCore.SIGNAL(_fromUtf8( "triggered()" )), self .open_set_value_form) |
二者使用的槽处理函数基本一致。
若不显示原界面,只需将原界面hide()即可,如:
1
|
self .form.hide() |
若需在弹出新窗口时同时原窗口保持可见,则不需这一步。且在这种情况下,若要原窗口可选为顶层窗体,则在显示新窗口时应使用show():
1
|
Form1.show() |
若新窗口为固定的顶层窗体,原窗体被遮盖,则应使用exec_():
1
|
Form1.exec_() |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/sollor525/article/details/40076395