PackInterface 代码
class PackInterface(QObject):
def __init__(self,
config_dict:Union[dict, defaultdict]):
super(PackInterface, self).__init__()
self.PackWidget = QWidget()
self.Pack_SourceFile = NPlianEdit(config_dict)
self.Pack_ImagePath = NPlianEdit(config_dict)
self.Pack_HintLineEdit = QLineEdit()
self.Pack_HintLineEdit.setMinimumHeight(25)
self.Pack_SourceFile.setPlaceholderText('源文件, 必填项, 支持文件拖拽')
self.Pack_ImagePath.setPlaceholderText('程序图标, 可为空, 支持文件拖拽')
packvbox = QVBoxLayout()
packvbox.addWidget(self.Pack_SourceFile)
packvbox.addWidget(self.Pack_ImagePath)
packvbox.addWidget(self.Pack_HintLineEdit)
self.PackWidget.setLayout(packvbox)
AnalysisInterface 继承 PackInterface
class AnalysisInterface(QMainWindow,
AnalysisStyle,
QrcodeStyle,
QRcodeInterface,
PackInterface):
general_refister_count = 3
ExitClick = pyqtSignal(bool)
MainClick = pyqtSignal(bool)
StickThreadConnect = pyqtSignal(bool)
AnalysisThreadConnect = pyqtSignal(bool)
UnicodeThreadConnect = pyqtSignal(bool)
C2aThreadConnect = pyqtSignal(bool)
A2cThreadConnect = pyqtSignal(bool)
ExExThreadConnect = pyqtSignal(bool)
ExDirThreadConnect = pyqtSignal(bool)
FileCopyThreadConnect = pyqtSignal(bool)
XmaindExtractThreadConnect = pyqtSignal(bool)
PackThreadConnect = pyqtSignal(bool)
def __init__(self,
database:QSqlDatabase,
config_dict:dict
):
super(AnalysisInterface, self).__init__()
super(AnalysisStyle, self).__init__()
super(QrcodeStyle, self).__init__()
super(QRcodeInterface, self).__init__(config_dict)
报错: PackInterface.__init__() missing 1 required positional argument: 'config_dict'
另一个程序代码又没问题,同样都是多继承(例子2):
SecondaryPLFCModule 代码
class SecondaryPLFCModule(QObject):
DEFAULTRATEVALUE = 1
DEFAULTVOLUMEVALUE = 50
DEFAULTPRIVATENAME = 'Administer'
def __init__(self, config_dict:Union[dict]):
super(SecondaryPLFCModule, self).__init__()
self.mediaplayer = QMediaPlayer()
self.medialist = QMediaPlaylist()
self.medialist.setPlaybackMode(QMediaPlaylist.Loop)
self.medialistwidget = NListWidget(config_dict)
self.medialistwidget.sortItems(Qt.DescendingOrder)
ICmediaGui继承SecondaryPLFCModule,代码正常运行
class ICmediaGui(QMainWindow,
ICmeiaPlayStyle,
SecondaryPLFCModule,
SecondaryTOPMLudule,
SecondaryTPCDModule,
SecondaryUSERModule):
LYRICFORMAT = ['lrc', None, 'txt']
MainClick = pyqtSignal(bool)
ExitClick = pyqtSignal(bool)
MediaList_UpdateFlag = pyqtSignal(MediaListCutType)
MediaVideo_SpaceFlag = pyqtSignal(bool)
Top_Visit_OccaConnect = pyqtSignal(bool)
Top_DriverVisit_OccaConnect = pyqtSignal(bool)
Top_Drodown_OccaConnect = pyqtSignal(bool)
Account_Exit_OccaConnect = pyqtSignal(bool)
Centra_ListWidget_Width = 260
_enumatate_gcut = MediaListCutType.GeneralCut
_enumatate_gadd = MediaListCutType.GeneralJustAddup
_enumatate_mcut = MediaListCutType.MusicCut
_enumatate_madd = MediaListCutType.MusicJustAddup
_enumatate_vcut = MediaListCutType.VideoCut
_enumatate_vadd = MediaListCutType.VideoJustAddup
def __init__(self,
database: Union[QSqlDatabase],
config_dict: dict
):
super(ICmediaGui, self).__init__()
super(ICmeiaPlayStyle, self).__init__(config_dict)
在例子2中,ICmeiaPlayStyle类内部是没有super的,仅仅是初始化
,所以在ICmediaGui对该类的继承中,需要super该类才能直接使用里面定义好的变量,或者ICmeiaPlayStyle.变量名调用也可以,我个人理解例子2中的
super(ICmediaGui, self).__init__()
super(ICmeiaPlayStyle, self).__init__(config_dict)
代码实际上是,QMainWindow是继承的QWidget,所以顺序是
super(ICmediaGui, self).__init__()
super(QWidget, self).__init__()
super(ICmeiaPlayStyle, self).__init__(config_dict)
super(ICmediaGui, self).__init__() 初始化QMainWindow类
super(QWidget, self).__init__() 初始化ICmeiaPlayStyle类
super(ICmeiaPlayStyle, self).__init__(config_dict) 初始化SecondaryPLFCModule类,而其他类如
SecondaryTOPMLudule,
SecondaryTPCDModule,
SecondaryUSERModule 不带有参数且已经内部super了,所以直接继承即可。
如果当ICmeiaPlayStyle类已经内部super过了呢,加上代码
结果执行报错:
SecondaryPLFCModule.__init__() missing 1 required positional argument: 'config_dict'
??, 这参数不是明明放进去了吗,作为小白百思不得其解。
后来想到一个可能,
以自定义的方法举例,当参数没有默认值时,需要往前放,已经有默认参数的往后放,否则会报错。回到之前的问题,那么既然ICmeiaPlayStyle类已经内部super并且只有一个self参数(继承时默认会给一个self的参数,所以一定意义上算无参数)
那么把该类顺序往后调呢,那么SecondaryPLFCModule顺序变成了在QMainWindow之后,那么如何继承?,很简单,回到之间的话-> QMainWindow是继承的QWidget,那么可以这么继承
class ICmediaGui(QMainWindow,
SecondaryPLFCModule,
ICmeiaPlayStyle,
SecondaryTOPMLudule,
SecondaryTPCDModule,
SecondaryUSERModule,
):
LYRICFORMAT = ['lrc', None, 'txt']
MainClick = pyqtSignal(bool)
ExitClick = pyqtSignal(bool)
MediaList_UpdateFlag = pyqtSignal(MediaListCutType)
MediaVideo_SpaceFlag = pyqtSignal(bool)
Top_Visit_OccaConnect = pyqtSignal(bool)
Top_DriverVisit_OccaConnect = pyqtSignal(bool)
Top_Drodown_OccaConnect = pyqtSignal(bool)
Account_Exit_OccaConnect = pyqtSignal(bool)
media_record = logger
Centra_ListWidget_Width = 260
_enumatate_gcut = MediaListCutType.GeneralCut
_enumatate_gadd = MediaListCutType.GeneralJustAddup
_enumatate_mcut = MediaListCutType.MusicCut
_enumatate_madd = MediaListCutType.MusicJustAddup
_enumatate_vcut = MediaListCutType.VideoCut
_enumatate_vadd = MediaListCutType.VideoJustAddup
def __init__(self,
database: Union[QSqlDatabase],
config_dict: dict
):
super(QWidget, self).__init__(config_dict)
或者
SecondaryPLFCModule.__init__(self, config_dict)
完美运行,需要注意的一点是如果习惯写成
super(ICmediaGui, self).__init__()
SecondaryPLFCModule.__init__(self, config_dict)
这样的话,需要给QMainWindow一个父类self,或者None,很诡异
super(ICmediaGui, self).__init__(None/self)
SecondaryPLFCModule.__init__(self, config_dict)
1--------------------------------------------第2点注意事项在例子1的问题修复中说明
回到例子1,其中QrcodeStyle内部没有super, AnalysisStyle内部已经super,所以在下列代码中我补上了super没问题吧(QRcodeInterface内部已经初始化了,此时如果使用QRcodeInterface进行super定位下一个类并初始化的话,是无法初始化到下一个类的,见下图)
所以写法可以这么写
class AnalysisInterface(QMainWindow,
PackInterface,
QRcodeInterface,
QrcodeStyle,
AnalysisStyle
):
general_refister_count = 3
ExitClick = pyqtSignal(bool)
MainClick = pyqtSignal(bool)
StickThreadConnect = pyqtSignal(bool)
AnalysisThreadConnect = pyqtSignal(bool)
UnicodeThreadConnect = pyqtSignal(bool)
C2aThreadConnect = pyqtSignal(bool)
A2cThreadConnect = pyqtSignal(bool)
ExExThreadConnect = pyqtSignal(bool)
ExDirThreadConnect = pyqtSignal(bool)
FileCopyThreadConnect = pyqtSignal(bool)
XmaindExtractThreadConnect = pyqtSignal(bool)
PackThreadConnect = pyqtSignal(bool)
def __init__(self,
database:QSqlDatabase,
config_dict:dict
):
super(QWidget, self).__init__(config_dict)
QrcodeStyle.__init__(self)
运行结果:
??,啥情况,Centra_Listwidget_Stl的样式丢失了,该样式属于AnalysisStyle类的,而AnalysisStyle类已经super过了啊,直接把常量拿来用没问题的,可是为什么报了这个错呢,个人理解,super继承就是一条链式反应:
正常顺序执行是没错的,再来缕下
QMainWindow -> PackInterface -> QRcodeInterface -> QrcodeStyle
super(QMainWindow , self).__init__() 继承自QWidget,下一个类为QWidget,则该代码初始化QWidget,触发QWidget的super代码,执行下一个类
super(QWidget, self).__init__() 已初始化QWidget类,下一个类为PackInterface,初始化PackInterface,PackInterface已经内部super,则执行下一个类
super(PackInterface, self).__init__() 已初始化PackInterface类,下一个类为QRcodeInterface,初始化QRcodeInterface,QRcodeInterface已经内部super,则执行下一个类
super(QRcodeInterface, self).__init__() 已初始化QRcodeInterface类,下一个类为QrcodeStyle,初始化QrcodeStyle,QrcodeStyle内部并没有super,链条断了,不再执行下一个类
super(QrcodeStyle, self).__init__() 上面已经提到,QRcodeInterface已经内部super了,所以QrcodeStyle不能用super(QRcodeInterface, self).__init__()的写法来写了,只能使用:QrcodeStyle.__init__(self)方法来进行初始化,但该方法不具备super的链式反应,即AnalysisStyle实际上只是继承了,但是常量没有继承过来,只能实例化AnalysisStyle.然后进行调用
解决办法: 初始化AnalysisStyle类
super(QWidget, self).__init__(config_dict)
QrcodeStyle.__init__(self)
改为,两个写法都行
super(QWidget, self).__init__(config_dict) / PackInterface.__init__(self, config_dict)
QrcodeStyle.__init__(self)
AnalysisStyle.__init__(self)
当然,QrcodeStyle内部加个super的话,直接像下面这样给PackInterface个参数就行了
def __init__(self,
database:QSqlDatabase,
config_dict:dict
):
PackInterface.__init__(self, config_dict)