文章目录
- 前言
- 一、情景再现
- 二、实现步骤
-
- 1.引入库
- 2.创建主窗口
- 3. 创建表窗口
- 4. 完整代码
- 5. 运行程序
- 总结
前言
在界面设计中,设计一个弹出窗口,并让用户输入信息是再常规不过的操作了。这篇文章就来介绍一下,在PyQt5是如何实现主窗口接收弹出窗口中的信息。
一、情景再现
假设现在需要弹出一个表窗口,让用户输入他的姓名以及联系方式。当完成输入后,用户需要点击提交按钮。这个时候,主窗口就需要提取用户刚刚输入的信息,并显示在主窗口页面。
这样的需求,可以有多种方法来实现。我们今天就主要用PyQt5里信号与槽的方式来实现这样的功能。
二、实现步骤
1.引入库
代码如下:
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QVBoxLayout
from PyQt5.QtWidgets import QLabel
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtWidgets import QLineEdit
from PyQt5.QtCore import pyqtSignal
要实现上面的要求,需要用到PyQt5.QtWidgets里QApplication,QWidget,QVBoxLayout,QLabel,QPushButton,QLineEdit和PyQt5.QtCore里pyqtSignal。
当然你也可以把属于同一个库里的功能模块放在同一行,这完全取决与个人编程的习惯。
2.创建主窗口
代码如下:
class MainWindow(QWidget):
def __init__(self):
"""MainWindow constructor"""
super().__init__()
self.setLayout(QVBoxLayout())
self.laber1 = QLabel(self) # 输入名字
self.laber2 = QLabel(self) # 输入电话号码
self.laber1.setText("输入您的名字.")
self.laber2.setText("输入您的手机号码")
self.change = QPushButton(self)
self.change.setText("更改")
self.change.clicked.connect(self.onChange)
self.layout().addWidget(self.laber1)
self.layout().addWidget(self.laber2)
self.layout().addWidget(self.change)
self.show()
def onChange(self):
self.formwindow = FormWindow()
self.formwindow.submitted1.connect(self.laber1.setText)
self.formwindow.submitted2.connect(self.laber2.setText)
self.formwindow.show()
首先,在主窗口__init__(self)里构造了一个竖直的排榜模式。
然后构造三个组件,分别是laber1,laber2和change。其中laber1、2是标签,用来显示用户的姓名和手机号码,而change是一个按钮组件,用来调出表窗口。
这时,就要给这个按钮一个信号。也就是说当按钮被用户点击时,它将会连接到所需要的功能组件里去。例如调出表窗口。
在PyQt5里信号与槽的语法如下:
object1.signalName.connect(object2.slotName)
也就是说上面的clicked是按钮的信号,而onChange是所对应的槽,当按钮被用户点击时,这条语句就会执行onChange里的所有语句。
而在onChange里,我们构造了一个表窗口,并且在这个表窗口里有两个信号,分别连接到laber1.setText和laber2.setText这个两个槽中,以便更新用户所提交的信息。
3. 创建表窗口
代码如下:
class FormWindow(QWidget):
submitted1 = pyqtSignal(str)
submitted2 = pyqtSignal(str)
def __init__(self):
super().__init__()
self.setLayout(QVBoxLayout())
self.edit1 = QLineEdit(self)
self.edit2 = QLineEdit(self)
self.submit = QPushButton(self)
self.submit.setText('Submit')
self.submit.clicked.connect(self.onSubmit)
self.layout().addWidget(self.edit1)
self.layout().addWidget(self.edit2)
self.layout().addWidget(self.submit)
self.show()
def onSubmit(self):
self.submitted1.emit(self.edit1.text())
self.submitted2.emit(self.edit2.text())
self.close()
在表窗口里,我们定义了两个信号,分别是submitted1和submitted2,这两个字符串信号。
如果你看懂了主窗口中__init__(self)里的组件是如何构造的,表窗口中edit1、edit2和submit的构造也是同样的原理。
所不同的是,在onSubmit这个功能块中,我们使用了emit这个方法,这不同与主窗口中connect这个方法。emit是返回槽里的参数,而connect可以理解为对接到槽,相信这个也很好理解。
很显然,self.onSubmit1.emit()返回了槽self.edit1.text()里的内容。
4. 完整代码
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QVBoxLayout
from PyQt5.QtWidgets import QLabel
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtWidgets import QLineEdit
from PyQt5.QtCore import pyqtSignal
class MainWindow(QWidget):
def __init__(self):
"""MainWindow constructor"""
super().__init__()
self.setLayout(QVBoxLayout())
self.laber1 = QLabel(self) # 输入名字
self.laber2 = QLabel(self) # 输入电话号码
self.laber1.setText("输入您的名字.")
self.laber2.setText("输入您的手机号码")
self.change = QPushButton(self)
self.change.setText("更改")
self.change.clicked.connect(self.onChange)
self.layout().addWidget(self.laber1)
self.layout().addWidget(self.laber2)
self.layout().addWidget(self.change)
self.show()
def onChange(self):
self.formwindow = FormWindow()
self.formwindow.submitted1.connect(self.laber1.setText)
self.formwindow.submitted2.connect(self.laber2.setText)
self.formwindow.show()
class FormWindow(QWidget):
submitted1 = pyqtSignal(str)
submitted2 = pyqtSignal(str)
def __init__(self):
super().__init__()
self.setLayout(QVBoxLayout())
self.edit1 = QLineEdit(self)
self.edit2 = QLineEdit(self)
self.submit = QPushButton(self)
self.submit.setText('Submit')
self.submit.clicked.connect(self.onSubmit)
self.layout().addWidget(self.edit1)
self.layout().addWidget(self.edit2)
self.layout().addWidget(self.submit)
self.show()
def onSubmit(self):
self.submitted1.emit(self.edit1.text())
self.submitted2.emit(self.edit2.text())
self.close()
if __name__ == "__main__":
app = QApplication(sys.argv)
mw = MainWindow()
sys.exit(app.exec())
5. 运行程序
运行程序后,截图如下:
可以看出,用户点击更改按钮后,输入了名字和一组数字,提交这个信息后,原来的主窗口中的标签就变成了用户所提交下信息。
总结
可以看出,在这样的设计下,我主窗口只需要知道表窗口会有什么信号返回就可以了。这样对于日后的维护也很方便,只要返回的信号不变,以及返回的信号数据类型和主窗口对应的数据类型一致就万无一失了。不需要考虑太多其他的因素。值得一提的是,我们这里返回的都是字符串,str这个类型,这篇文章并没有对用户所输入的内容进行检查。