最近做个软件,用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