1

QStandardItemModel 派生オブジェクトを PythonQt に送信しようとしていますが、どのように送信する必要があるかについて少し混乱しています。boost::python を使用していたとき、boost::noncopyable のようないくつかのコントロールを使用して、このオブジェクトを再作成するのではなく、Python と共有していることを確認しました。また、python 内から python へのブースト共有ポインターを提供するための構造もありました。

class Scene : public boost::enable_shared_from_this<Scene>, public QStandardItemModel

ただし、PythonQt では、何が利用できるのかわかりません。この関数callは、すべての関数パラメーターに対して QVariantList を取ります。

QVariant PythonQt::call(PyObject* object, const QString &callable, const QVariantList &args = QVariantList))

私が今混乱しているのは、QVariant を介してオブジェクトを python に取得する方法です。QStandardItemModel から派生したので、既に登録されていると思いました

void MyObject::someFunction(QString fileName)
{
    QVariant myObjectV = qVariantFromValue(this);
    // send to python
    ...
}

しかし、これにより次のエラーが発生します。

'qt_metatype_id' : is not a member of 'QMetaTypeId<MyObject>'

クラスを宣言した後に登録しようとしましたが、これは別のエラーをスローします。

class MyObject : public QStandardItemModel
{
Q_OBJECT
...
};
Q_DECLARE_METATYPE(MyObject)

QStandardItemModel::QStandardItemModel(const QStandardItemModel&) is private within this context.  

Q_DECLARE_METATYPE を追加するヘッダーと、常に QStandardItemModel から派生するがそれ以外は無関係なクラスを持つ別のヘッダーで、実際に 2 回エラーが発生します。

Q_DECLARE_METATYPE は、このオブジェクトを QVariant に変換する正しい方法ですか?

BOOST_PYTHON_MODULE(シーン) { class_("シーン"); }

4

1 に答える 1

1

はい、デフォルトでは、QVariant次のタイプのいずれかを取ることができます - http://doc.qt.io/qt-4.8/qvariant.html#Type-enum - そしてそれらはあなたの仕事には十分ではありません。qmetatype システムを使用して、追加の型を自分で宣言する必要があります。したがって、関数を呼び出す必要がありqRegisterMetaType()ます。

于 2011-11-26T16:49:34.037 に答える