Python Forum
PyQt5: How to use connectSlotsByName ?
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
PyQt5: How to use connectSlotsByName ?
#1
Hi

I'm looking for designing a way to display various layouts in a window using PyQt5. To do that, I try to define these layouts and the corresponding slots in specific classes to avoid defining all these layouts and slots in a single class
I want to connect signals and slots through the «ConnectSlotsByName» method.
As a test, I wrote this script :
from PyQt5 import QtWidgets
from PyQt5.QtCore import QMetaObject, pyqtSlot
from PyQt5.QtWidgets import  QMainWindow,  QWidget,   QPushButton
from PyQt5.QtWidgets import QHBoxLayout, QVBoxLayout

class A1(QtWidgets.QWidget):
	def __init__(auto):
		super(A1,auto).__init__()
		
	def init(auto):
		zc=QHBoxLayout()
		zc.addStretch()
		btn=QPushButton("A1")
		btn.setObjectName("quit")
		zc.addWidget(btn)
		zc.addStretch()
		vbl=QVBoxLayout(auto)
		vbl.addStretch()
		vbl.addLayout(zc)
		auto.show()
		QMetaObject.connectSlotsByName(auto)
	@pyqtSlot()
	def on_quit_clicked(auto):
		print("on_quit_clicked",type(auto))

class A2():
	def init(auto,Fenster):
		zc=QHBoxLayout()
		zc.addStretch()
		btn=QPushButton("A2")
		btn.setObjectName("quitter")
		zc.addWidget(btn)
		zc.addStretch()
		vbl=QVBoxLayout(Fenster)
		vbl.addStretch()
		vbl.addLayout(zc)
		Fenster.show()
		QMetaObject.connectSlotsByName(Fenster)
	@pyqtSlot()
	def on_quitter_clicked(auto):
		print("on_quitter_clicked",type(auto))
		
class A3_1(QMainWindow):
	def __init__(auto):
		super(A3_1,auto).__init__()
		print("A3_1.__init__",type(auto))
	def init(auto):
		print("A3_1.init",type(auto))
		auto.setGeometry(250,200,800,300)
		auto.setWindowTitle('A3')
class A3_2(QWidget):
	def __init__(auto):
		super(A3_2,auto).__init__()
		print("A3_2.__init__",type(auto))
	def init(auto, Fenster):
		zc=QHBoxLayout()
		zc.addStretch()
		btn=QPushButton("A3_a")
		btn.setObjectName("leave")
		zc.addWidget(btn)
		zc.addStretch()
		auto.btn=QPushButton("A3_b")
		auto.btn.setObjectName("autoleave")
		zc.addWidget(auto.btn)
		zc.addStretch()
		vbl=QVBoxLayout(auto)
		vbl.addStretch()
		vbl.addLayout(zc)
		Fenster.setCentralWidget(auto)
		QMetaObject.connectSlotsByName(Fenster)
	@pyqtSlot()
	def on_leave_clicked(auto):
		print("on_leave_clicked",type(auto))
	@pyqtSlot()
	def on_autoleave_clicked(auto):
		print("on_autoleave_clicked",type(auto))

def mainA1(args):
	app = QtWidgets.QApplication(args)
	auteur=A1()
	auteur.init()
	app.exec()
	return 0
def mainA2(args):
	app = QtWidgets.QApplication(args)
	Fenster=QtWidgets.QWidget()
	auteur=A2()
	auteur.init(Fenster)
	Fenster.show()
	app.exec()
	return 0
def mainA3(args):
	app = QtWidgets.QApplication(args)
	Fenster=A3_1()
	Fenster.init()
	print(type(Fenster))
	auteur=A3_2()
	auteur.init(Fenster)
	Fenster.show()
	app.exec()
	return 0

if __name__ == '__main__':
	import sys
	sys.exit(mainA1(sys.argv))		
#	sys.exit(mainA2(sys.argv))
#	sys.exit(mainA3(sys.argv))	
Only in «mainA1» does «connectSlotsByName» really connect the signal with the corresponding slot.

What should I code to have «mainA2» and «mainA3» correctly use «connectSlotsByName» ?
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Huge code problems (buttons(PyQt5),PyQt5 Threads, Windows etc) ZenWoR 0 1,498 Apr-06-2019, 11:15 PM
Last Post: ZenWoR

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020