之前在学习PyQt5的过程中,试着自己编写一个音乐播放器,基本功能实现后,希望添加一个独立的播放列表,然后实现播放列表和播放主界面之间的函数调用(双击播放列表的歌曲,主窗口播放歌曲)。
这虽然是一个简单的问题(对职业程序员来说),但作为一个非专业IT人员,把这些搞清楚也是有点麻烦的,经过在网上查找资料以及实际测试后,终于把问题解决了,至少现在实现了在主窗口和子窗口之间的函数调用以及参数传递。
本文以简化的窗口调用实例来说明:主窗口和子窗口分别有一个QListWidget控件(列表),主窗口有一个按钮,点击后,主窗口列表填入数据(1-5),子窗口也填入相同的数据,并显示窗体。
两个窗体的QListWidget控件,将添加‘双击’响应,即双击主窗口的列表控件中的任意项,主窗口的QTextEdit(文本控件)将显示当前列表项的索引值。
如果在子窗口中双击列表项,其项索引值将同样被传递到主窗口,并显示在QTextEdit中。
先看第一个点,PyQt中子窗口调用很简单:
先定义两个窗口类:
主窗口:
class win2(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
子窗口:
子窗口带了一个参数,用于传递列表数据
class win1(QWidget):
def __init__(self,lt):
super().__init__()
self.lt=lt
self.initUI()
窗口的UI布局怎么写就不介绍了,比较简单,后面会将完整代码贴出来。
主窗口调用子窗口:
self.win11=win1(list1)
def list_loaddata_func(self):
for i in range(5):
self.qlist.addItem(str(i))
list1.append(str(i))
self.win11=win1(list1)
self.win11.show()
先实例化子窗口类,然后显示即可。
子窗口调用主窗口函数:
def win1_doubleplay(self):
self.ind1=self.qlist.currentRow()
win22.doubleplay2()
win22是主窗口类的实例化,子窗口中直接调用其函数即可。
完整代码:
import os
import sys
import time
import random
import configparser
import ffmpeg
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtMultimedia import *
txt1=''
list1=[]
class win1(QWidget):
def __init__(self,lt):
super().__init__()
self.lt=lt
self.initUI()
def initUI(self):
self.btn_show_txt=QPushButton('打印',self)
self.btn_show_txt.setGeometry(20,100,60,20)
self.btn_show_txt.clicked.connect(self.show_text_func)
self.label_list=QLabel(self)
self.label_list.setGeometry(100,20,100,20)
self.label_list.setText('子窗口列表数据:')
self.qlist=QListWidget(self)
self.qlist.doubleClicked.connect(self.win1_doubleplay)
self.qlist.setGeometry(100, 40, 300, 120)
self.list_add()
self.setWindowTitle('子窗口')
self.setGeometry(300,300,450,200)
def list_add(self):
for l in self.lt:
self.qlist.addItem(l)
def show_text_func(self):
win22.win1_show2_func()
def win1_doubleplay(self):
self.ind1=self.qlist.currentRow()
win22.doubleplay2()
class win2(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.win11=win1(list1)
self.btn_win1=QPushButton('子窗口',self)
self.btn_win1.setGeometry(40,40,60,20)
self.btn_win1.clicked.connect(self.win1_show_func)
#self.label_txt=QLabel(self)
#self.label_txt.setGeometry(40,100,60,20)
#self.label_txt.setText('haha')
self.btn_list=QPushButton('导入list',self)
self.btn_list.setGeometry(40,130,60,20)
self.btn_list.clicked.connect(self.list_loaddata_func)
self.label_list=QLabel(self)
self.label_list.setGeometry(120,20,100,20)
self.label_list.setText('主窗口列表数据:')
self.qlist=QListWidget(self)
self.qlist.doubleClicked.connect(self.doubleplay)
#self.qlist.setStyle(QStyleFactory.create('Fusion'))
self.qlist.setGeometry(120, 40, 200, 120)
self.label_index=QLabel(self)
self.label_index.setGeometry(350,20,60,20)
self.label_index.setText('索引值显示:')
self.te_123=QTextEdit(self)
self.te_123.setGeometry(350,40,200,120)
self.te_123.setText('')
self.setWindowTitle('主窗口')
self.setGeometry(100,100,800,600)
self.show()
def list_loaddata_func(self):
for i in range(5):
self.qlist.addItem(str(i))
list1.append(str(i))
self.win11=win1(list1)
self.win11.show()
def win1_show_func(self):
self.win11.show()
def win1_show2_func(self):
print('jjjjj')
def doubleplay(self):
self.ind2=self.qlist.currentRow()
self.te_123.setText(str(self.ind2))
#print('db{}'.format(self.ind2))
def doubleplay2(self):
self.ind3=self.win11.qlist.currentRow()
self.te_123.setText(str(self.ind3))
@staticmethod
def show_txt_func(parent=None):
txt1='win1 haha'
print(txt1)
win22.label_txt.setText('nihao')
if __name__ == '__main__':
app=QApplication(sys.argv)
win22=win2()
sys.exit(app.exec_())
演示视频:
python窗口间参数传递及函数调用