11
QAbstractListModelでカスタムクラスを使用しようとしています.Q_DECLARE_METATYPEがまったく機能しません。Q_DECLARE_METATYPEがまったく機能しない
#include <QMetaType>
#include <QVariant>
#include <QDebug>
typedef int x;
Q_DECLARE_METATYPE(x)
void main() {
QVariant v;
qDebug() << v.canConvert<x>();
}
を、出力はまだ偽です:
は問題がどこにあるかテストするために、私は次のようなコードを簡素化しました!
ところで、私が実装するコードは次のようである:
namespace ns{
class a {
public:
a(); //default constructor
a(const a&); //copy constructor
~a();
}
}
Q_DECALRE_METATYPE(ns::a);
と私はこのようなQAbstractListModel ::データを再実装しようとすると:
QList<ns::s> list; //this is actually a member field of the custom model.
QVariant MyListModel::data(const QModelIndex& index, int role) const {
Q_UNUSED(role)
return list.at(index.row());
}
コンパイラが報告され、エラーのように:
cannot convert const ns::a to QVariant::Type
うん:http://qt-project.org/doc/qt-5.0/qtcore/qmetatype.html#Q_DECLARE_METATYPE言われていること
が、ここでQ_DECLARE_METATYPEの作業を示してかなり簡単な例です:NGは、デフォルトコンストラクタ、コピーコンストラクタや公共デストラクタを持っている必要がありますQ_DECLARE_METATYPEに渡されます問題はです。問題は 'MyModel :: data(const QModelIndex&index、int role)const'を実装するときに、' return Myclass'ではなく 'return QVariant :: fromValue(MyClass)'を使うべきだったということです。 – user2826776
[Qtカスタムタイプのドキュメント](http://doc.qt.io/qt-5/custom-types.html)を読むと、マクロの使い方がわかりませんでした。 'Q_DECLARE_METATYPE(MyClass);'がクラス自身のスコープの内部にある場合、コンパイルはエラー '名前空間以外のスコープ 'クラスMyClass'の明示的な特殊化で失敗します。この例は、マクロを挿入するための正しい場所を示しています。ありがとう! – fgiraldeau