У меня возникают проблемы с попыткой добавить миксин с метаклассом в класс, основой которого является QWidget. Я знаю, что PyQt5 поддерживает совместное множественное наследование, и если мой класс MixIn имеет нет метакласса, тогда все работает нормально. Однако, если у него есть метакласс — будь то метакласс pyqtWrapperType
, используемый QWidgets, или производный метакласс, я получаю следующую ошибку:
Process finished with exit code -1073741819 (0xC0000005)
Код остальной части сценария выполняется, но QWidget не отображается. Вот базовый код (без методов, так как я знаю, что они не нужны для решения проблемы)
import abc, sys
from PyQt5 import QtWidgets, QtCore
# Test Metaclass, will have more if metaclasses work
class MyMeta(abc.ABCMeta, QtCore.pyqtWrapperType):
def __init__(cls, name, bases, attrs):
super(MyMeta, cls).__init__(name, bases, attrs)
# MixIn class - ignore the calls to methods for now
# Have same issue if metaclass set to pyqtWrapperType
class LocatorWidget(metaclass=MyMeta):
def __init__(self, locator=None, name='', parameters={}, **kwargs):
super().__init__(**kwargs)
# self.setup_parameters(parameters)
self.locator = locator
self.name = name if name else ''
self.widgetType = self.__class__.__name__.replace('LW', '')
# self.setup()
# Derived class with a QWidget base
class LWComboBox(QtWidgets.QComboBox, LocatorWidget):
def __init__(self, locator, **kwargs):
super().__init__(locator=locator, **kwargs)
def main():
app = QtWidgets.QApplication(sys.argv)
# locator is class in full code, using this as filler for now
locator=[0,1,2,3]
cb = LWComboBox(locator=locator)
cb.addItems([str(x) for x in range(5)])
# Test to see if attribute is set
print(cb.locator)
window = QtWidgets.QDialog()
window.form = QtWidgets.QFormLayout()
window.form.addRow(cb)
window.setLayout(window.form)
window.show()
if __name__ == '__main__':
main()
У меня нет ошибки конфликта метаклассов: базовый класс и производные классы не имеют разных метаклассов, поскольку MyMeta является производным от pyqtWrapperType.
Если этот процесс не работает, мне интересно, следует ли мне придерживаться моей предыдущей идеи, которая заключалась в том, чтобы окутывать виджет атрибутами и методами, которыми я хочу поделиться, в отдельном классе, причем виджет является одним из атрибутов, но он было бы хорошо создать подклассы QWidgets напрямую с необходимыми абстрактными методами и атрибутами.
К вашему сведению, я запускаю PyCharm 2016.2.3 в Anaconda с PyQt5 версии 5.6 (PyQt не может быть обновлен до более поздних версий в Anaconda)