имеет некоторые интересные идеи и обходные пути (но обратите внимание, что изначально он был написан для pyqt4, поэтому некоторые вещи могут быть устаревшими).

лкнулся с проблемой при использовании множественного наследования с PyQt,Программа 1 # Исходный код, как показано ниже:

#!python3
import sys;
from PyQt5.QtWidgets import *;
from PyQt5.QtGui import *;
from PyQt5.QtCore import *;

class WP_Widget(QWidget):
    def __init__(self):
        print("WP_Widget init");
        super().__init__();

class WP_Line(QLineEdit):
    def __init__(self, text='',*args, **kargs):
        super().__init__();
        self.setText(text);

class Widget_C(WP_Widget, WP_Line):
#class Widget_C(WP_Line, WP_Widget):
    def __init__(self):
        print('Widget_C self = ', self)
        super().__init__();

class App(QWidget):
    def __init__(self):
        super().__init__();
        fname = Widget_C();
        self.left = 100
        self.top = 100
        self.width = 100
        self.height = 100
        self.show();

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

Когда выполнить, он покажет ошибку как:

AttributeError: 'Widget_C' object has no attribute 'setText'

Если изменитьWidget_C определение от

class Widget_C(WP_Widget, WP_Line):

в

class Widget_C(WP_Line, WP_Widget):

Это будет работать успешно.

Я думаю, это будет связано сMRO в Python3, поэтому я пишу другойпрограмма 2 # для симуляции состояния:

#!python3

class QWidget():
    def __init__(self):
        print("Base QWidget init.");

class QLineEdit(QWidget):
    def __init__(self):
        print('LineEdit init');
        super().__init__();

    def setText(self, text):
        print('setText called');

class WP_Widget(QWidget):
    def __init__(self):
        print('WP_Widget Init');
        super().__init__()

class WP_Line(QLineEdit):
    def __init__(self, text='',*args, **kargs):
        print('WP_Line init');
        super().__init__();
        self.setText(text)

class Widget_C(WP_Widget, WP_Line):
#class Widget_C(WP_Line, WP_Widget):
    def __init__(self):
        super().__init__()

c_test = Widget_C()

Но независимо от того, какая последовательность наследованияWiget_C,

class Widget_C(WP_Line, WP_Widget):

или же

class Widget_C(WP_Widget, WP_Line):

они оба будут работать нормально.

Так может кто-нибудь помочь:

Объяснить, почемупрограмма 1 # терпит неудачу, когда определяется какclass Widget_C(WP_Widget, WP_Line):, MRO это только мое предположение.Почемупрограмма 2 # можно нормально запустить в обоих условиях?Помогите изменитьпрограмма 2 # воспроизвести состояниепрограмма 1 # .

Python и порядок методов в множественном наследовании объясняет что-то оMROЭто связано с моим вопросом, но не совсем ответ. Если порядок наследования такой же, мойпрограмма 1 # а такжепрограмма 2 не должно иметь разных результатов, поэтому ключевой момент заключается в том, почемупрограмма 1 # а такжепрограмма 2 есть другое явление.

Ответы на вопрос(1)

Ваш ответ на вопрос