Pyqt5主窗口调用子窗口,自定义信号与槽函数

主窗口调用子窗口

目前有一个主窗口Main

class Main():
	def openfile(self):
	        filenames=QFileDialog.getOpenFileNames(self,'选择文件','./')
	        if filenames[0]:
	            #如果成功读取到了文件,则弹出子窗口

比较原始的想法是,能不能直接把子窗口导入程序,然后如果读取成功就生成一个子窗口呢?
在pyqt5中,这样做是不可以的,原因可能是这样会导致多个窗口同时出现,进而引发冲突。
既然这种方法不可以,一般采用的方法是:

  • 在主窗口中添加一个信号(比如说设置一个按钮),当我点击这个按钮时,发出调用子窗口的信号。
  • 在子窗口中添加一个槽函数,当我接受到信号时,执行相应指令。
  • 建立一个驱动程序,将主窗口和子窗口导入驱动程序,将主窗口的信号与子窗口的槽建立连接。

但是在我们这个程序中,调用子窗口的信号并不是点击某个按钮,而是读取文件成功,这时候该怎么办呢。
其实是要利用pyqt5的自定义信号

  • 自定义一个信号用来表示状态。
  • 当达到相应状态时,发送信号。
    具体实现方式:

自定义信号与槽函数

class Main():
	#我们在主窗口中新建一个pyqtsignal的实例作为类参数
	sign=pyqtsignal()
	def openfile(self):
	         filenames=QFileDialog.getOpenFileNames(self,'选择文件','./')
	         if filenames[0]:
	         send()#调用信号发送函数
	def send(self):
		self.sign.emit()#发送信号,当然,也可以直接将这一句话写在上面的send()处
	

这样我们就完成了信号发送端的配置,那么接收端呢?
在这个例子中,接受端接受到信号只需要调用自身的show函数即可,我们不需要额外写一个槽函数,也就是将show作为自身的槽函数。
在这个实例中,我们需要写一个驱动程序,它包含了我们的主窗口类和子窗口类,在驱动程序中,加入语句

A1 =MyMain()#主窗口在驱动程序中的类
B1=widget()#子窗口在驱动程序中的类
A1.main_ui.sendmsg.connect(B1.dialog.show)#连接

遗留的问题

在写驱动函数的时候,我遇到了这样的问题
我导入主窗口和子窗口之后,并不是直接用他们做的类,而是新建了两个类继承他们,主窗口的类是这样写的。

class MyMain(QMainwindow,Main):  # 继承主窗口函数的类, 继承编写的主函数

    def __init__(self):
        QMainWindow.__init__(self)  # QMainWindow的初始化
        Main.__init__(self)

使用多继承继承了两个类之后,我将MyMain类的初始化实例信号连接到子窗口类的时候会报错,如果只继承QMainwindow然后在MyMain类里初始化一个Main实例作为类参数不会报错,或者直接不用QMainwindow类直接单继承Main类也可以完成任务。
目前还不清楚原因,可能是多继承的两个类产生了冲突。

你可能感兴趣的:(Pyqt5主窗口调用子窗口,自定义信号与槽函数)