2017-03-15 16 views
2

ベースを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ははアナコンダの後のバージョンに更新することができない)

答えて

1

pyqtWrapperTypeがもう存在しています。あなたはPyQt5で同等の種類をしたい場合は、いずれかを使用することができます。

pyqtWrapperType = type(QtCore.QObject) 

か:

from sip import wrappertype as pyqtWrapperType 
+0

私は 'pyqtWrapperType'がdoes't存在するという問題がありませんでした。私はPyQt5の最新バージョンを持っていないことをクイックチェックで示しています。 (私はAnacondaとPyQt5 v 5.60を持っています)あなたの修正を更新して適用して何が起こるかを見てみましょう。しかし、私が持っているバージョンで 'pyqtWrapperType'を' type(QtCore.QObject) 'に変更しても問題は解決していないようです。 – Bill3000

+0

あなたの例に関連のないいくつかのバグを修正した後、私が提案した変更を使用すると、それは完全にうまく動作することがわかりました。 – ekhumoro

+0

あなたはどのバージョンの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

関連する問題