ベースをQWidgetとするクラスにメタクラスを含むミックスインを追加しようとするときに問題があります。私はPyQt5 supports cooperative multiple inheritanceを知っています。私のMixInクラスにメタクラスがない場合、問題なく動作します。しかし、それはメタクラスを持っている場合 - それはQWidgetsで共有pyqtWrapperType
メタクラスまたは派生メタクラスあるかどうか、私は、次のエラーが表示さ:PyQt5:派生したQWidgetクラス内のメタクラスを持つミックスに関する問題
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を直接サブクラス化すると良いでしょう。アナコンダにFYI I実行PyCharm 2016年2月3日として
PyQt5バージョン5.6(PyQtははアナコンダの後のバージョンに更新することができない)
私は 'pyqtWrapperType'がdoes't存在するという問題がありませんでした。私はPyQt5の最新バージョンを持っていないことをクイックチェックで示しています。 (私はAnacondaとPyQt5 v 5.60を持っています)あなたの修正を更新して適用して何が起こるかを見てみましょう。しかし、私が持っているバージョンで 'pyqtWrapperType'を' type(QtCore.QObject) 'に変更しても問題は解決していないようです。 – Bill3000
あなたの例に関連のないいくつかのバグを修正した後、私が提案した変更を使用すると、それは完全にうまく動作することがわかりました。 – ekhumoro
あなたはどのバージョンのPyQtを使用していますか? [http://python.6.x6.nabble.com/What-happend-to-PyQt5-QtCore-pyqtWrapperType-td5207614.html](ここ)によると、pyqtWrapperTypeはPyQt 5.7で削除され、5.6でも利用可能です。 Anaconda(私が使っている)[https://github.com/ContinuumIO/anaconda-issues/issues/1023](PhQt 5.7はサポートしていません)。これは私が手動で5.7にアップグレードしなければならないバージョンの問題ですか? 私が 'type(QObject)'を実行するとき、PyQt 5.6で私のために 'pyqtWrapperType'を返します。 – Bill3000