下面就为大家详细讲解一下“Python PyQt5中窗口数据传递的示例详解”的完整攻略。
1. PyQt5基础知识
在开始讲解窗口数据传递的过程前,我们需要先了解一些PyQt5的基础知识,如创建窗口、添加组件以及信号与槽等。
1.1 创建窗口
PyQt5中可以使用QMainWindow来创建窗口,代码如下所示:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = QMainWindow()
mainWindow.show()
sys.exit(app.exec_())
在代码中,我们首先导入了PyQt5.QtWidgets模块中的QApplication和QMainWindow类,然后使用QApplication创建了一个应用程序实例。接着,我们创建了一个QMainWindow实例并调用show()方法显示出来。最后,使用sys.exit()方法来退出应用程序。
1.2 添加组件
在窗口中添加组件可以通过调用QMainWindow的setCentralWidget()方法实现,示例代码如下:
from PyQt5.QtWidgets import QLabel, QWidget, QHBoxLayout
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = QMainWindow()
centralWidget = QWidget() # 创建中心窗体
layout = QHBoxLayout() # 创建水平布局
label = QLabel('Hello, world!') # 创建标签
layout.addWidget(label) # 将标签添加到布局中
centralWidget.setLayout(layout) # 将布局添加到中心窗体中
mainWindow.setCentralWidget(centralWidget) # 将中心窗体添加到主窗口中
mainWindow.show()
sys.exit(app.exec_())
在代码中,我们首先导入了QLabel、QWidget和QHBoxLayout类。然后创建了一个QWidget实例作为中心窗体,再创建一个QHBoxLayout实例作为水平布局。接着,创建一个QLabel实例作为标签,使用addWidget()方法将标签添加到布局中,再将布局添加到中心窗体中。最后,将中心窗体添加到主窗口中。
1.3 信号与槽
信号与槽是PyQt5中的一种通信机制,信号是用来发送事件的,槽是用来接收事件的。当信号被触发时,与之关联的槽函数就会被自动调用。下面是一个简单的信号与槽的示例:
from PyQt5.QtWidgets import QPushButton
def buttonClicked():
print('Button clicked')
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = QMainWindow()
button = QPushButton('Click me')
button.clicked.connect(buttonClicked) # 关联信号和槽
mainWindow.setCentralWidget(button)
mainWindow.show()
sys.exit(app.exec_())
在代码中,我们首先导入了QPushButton类,然后创建一个按钮实例,将它添加到中心窗体中。接着,使用clicked信号将按钮的点击事件和buttonClicked槽函数关联起来。最后,将中心窗体添加到主窗口中。
2. PyQt5窗口数据传递
在PyQt5中,窗口数据传递通过信号和槽的方式实现。可以将一个窗口的数据传递给另一个窗口,也可以将一个窗口的数据传递给主窗口。
2.1 将一个窗口的数据传递给另一个窗口
将一个窗口的数据传递给另一个窗口可以通过信号和槽的方式实现,示例代码如下:
from PyQt5.QtWidgets import QDialog, QVBoxLayout, QLabel, QLineEdit, QPushButton
class InputDialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle('Input Dialog')
self.label = QLabel('Input your name:')
self.lineEdit = QLineEdit()
self.button = QPushButton('OK')
layout = QVBoxLayout()
layout.addWidget(self.label)
layout.addWidget(self.lineEdit)
layout.addWidget(self.button)
self.setLayout(layout)
self.button.clicked.connect(self.accept) # 关联信号和槽
def getName(self):
return self.lineEdit.text()
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle('Main Window')
self.inputDialog = InputDialog(self) # 创建Input Dialog实例
self.inputDialog.accepted.connect(self.showName) # 关联信号和槽
def showName(self):
name = self.inputDialog.getName()
self.statusBar().showMessage('Your name is ' + name) # 将输入的名字显示在状态栏中
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
在代码中,我们首先创建了一个InputDialog类,该类继承自QDialog,包含一个标签、一个文本框和一个按钮。在按钮被点击时,使用accept()方法关闭窗口。在MainWindow类中,我们创建了一个InputDialog实例,并将其与showName()槽函数关联起来,使得当InputDialog被关闭时,可以获取输入的名字并将其显示在状态栏中。
2.2 将一个窗口的数据传递给主窗口
将一个窗口的数据传递给主窗口也可以通过信号和槽的方式实现。在下面的示例代码中,我们创建了一个计算器程序,可以将计算的结果传递给主窗口。代码如下所示:
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QMainWindow
from functools import partial
class Calculation(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.initUI()
self.result = 0
def initUI(self):
self.num1 = QLineEdit()
self.num2 = QLineEdit()
self.label = QLabel('=')
self.output = QLineEdit()
self.output.setReadOnly(True)
addBtn = QPushButton('+')
addBtn.clicked.connect(partial(self.calculate, '+')) # 关联信号和槽
subBtn = QPushButton('-')
subBtn.clicked.connect(partial(self.calculate, '-'))
mulBtn = QPushButton('*')
mulBtn.clicked.connect(partial(self.calculate, '*'))
divBtn = QPushButton('/')
divBtn.clicked.connect(partial(self.calculate, '/'))
layout = QHBoxLayout()
layout.addWidget(self.num1)
layout.addWidget(addBtn)
layout.addWidget(subBtn)
layout.addWidget(mulBtn)
layout.addWidget(divBtn)
layout.addWidget(self.num2)
layout.addWidget(self.label)
layout.addWidget(self.output)
self.setLayout(layout)
def calculate(self, op):
num1 = float(self.num1.text())
num2 = float(self.num2.text())
if op == '+':
self.result = num1 + num2
elif op == '-':
self.result = num1 - num2
elif op == '*':
self.result = num1 * num2
elif op == '/':
self.result = num1 / num2
self.output.setText(str(self.result))
self.emitData() # 发送信号
def emitData(self):
self.resultEmitted.emit(self.result) # 发送信号
resultEmitted = pyqtSignal(float) # 声明一个信号
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle('Main Window')
self.calculation = Calculation() # 创建一个计算器实例
self.setCentralWidget(self.calculation)
self.statusBar().showMessage('Result:')
self.calculation.resultEmitted.connect(self.showResult) # 关联信号和槽
def showResult(self, result):
self.statusBar().showMessage('Result: ' + str(result)) # 显示计算结果
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
在代码中,我们首先创建了一个Calculation类,该类包含两个文本框、一个标签、一个只读文本框和四个按钮,可以执行加减乘除的计算。在calculate()方法中,我们根据操作符对两个数进行计算,并将结果保存在result中,然后将结果显示在output文本框中。在emitData()方法中,我们使用resultEmitted信号将计算结果发送出去。在MainWindow类中,我们创建了一个Calculation实例,并将其设为主窗口的中心窗体。同时,我们将resultEmitted信号与showResult()槽函数关联起来,使得可以在主窗口中显示计算结果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python PyQt5中窗口数据传递的示例详解 - Python技术站