<Python>PyQt5,多窗口之间参数传递和函数调用

PyQt5的多窗口之间参数如何传递,函数如何调用?

之前在学习PyQt5的过程中,试着自己编写一个音乐播放器,基本功能实现后,希望添加一个独立的播放列表,然后实现播放列表和播放主界面之间的函数调用(双击播放列表的歌曲,主窗口播放歌曲)。
这虽然是一个简单的问题(对职业程序员来说),但作为一个非专业IT人员,把这些搞清楚也是有点麻烦的,经过在网上查找资料以及实际测试后,终于把问题解决了,至少现在实现了在主窗口和子窗口之间的函数调用以及参数传递。

本文以简化的窗口调用实例来说明:主窗口和子窗口分别有一个QListWidget控件(列表),主窗口有一个按钮,点击后,主窗口列表填入数据(1-5),子窗口也填入相同的数据,并显示窗体。
两个窗体的QListWidget控件,将添加‘双击’响应,即双击主窗口的列表控件中的任意项,主窗口的QTextEdit(文本控件)将显示当前列表项的索引值。
如果在子窗口中双击列表项,其项索引值将同样被传递到主窗口,并显示在QTextEdit中。

<Python>PyQt5,多窗口之间参数传递和函数调用_第1张图片
<Python>PyQt5,多窗口之间参数传递和函数调用_第2张图片
本例中涉及两个点:
1 是子窗口调用
2 是多窗口函数调用

先看第一个点,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窗口间参数传递及函数调用

你可能感兴趣的:(python,编程世界,python,qt,qt5)