12

メタタイプとして登録したい QObject のサブクラスであるクラスがあります。QObjectのドキュメント には、コピー コンストラクターは非公開にする必要があると記載されていますが、QMetaType のドキュメントには、型にはパブリックのデフォルト コンストラクター、パブリックのコピー コンストラクター、およびパブリックのデストラクタが必要であると記載されています。

QObject のプライベート コピー コンストラクターをオーバーライドして、パブリック コピー コンストラクターを宣言できますが、これは安全ですか?

class MyClass : public QObject {
  Q_OBJECT
  public:
    MyClass();
    MyClass(const MyClass &other);
    ~MyClass();
}
Q_DECLARE_METATYPE(MyClass);
4

5 に答える 5

19

QObject のコピー コンストラクターを公開するのは安全ではありません。ただし、クラス ポインターをメタタイプとして登録することはできます。すなわち:

Q_DECLARE_METATYPE(MyClass*);

それが、Qt が QObject と QWidget でそれを処理する方法です。

于 2009-06-05T15:14:58.967 に答える
6

あなたが求めているものは完全に大丈夫です。QObjectコピーコンストラクターの実装でコピーコンストラクター(プライベート)を使用することはできませんが、繰り返しになりますが、誰もあなたに次のことを強制しません。

class MyClass : public QObject {
    Q_OBJECT
public:
    // ...
    MyClass( const MyClass & other )
        : QObject(), i( other.i ) {} // NOTE: calling QObject default ctor
    // ...
private:
    int i;
};

から必要なサービスに応じて、copyctorとcopyassignment演算子の両方で、QObjectからいくつかのプロパティをコピーする必要があります。otherたとえば、動的プロパティ機能にQObjectを使用する場合は、それらもコピーする必要があります。

    MyClass( const MyClass & other )
        : QObject(), i( other.i )
    {
        Q_FOREACH( const QByteArray & prop, other.dynamicPropertyNames() )
            setProperty( prop.constData(), other.property( prop.constData() ) );
    }

同様に、信号/スロット接続を維持したい場合。

于 2009-08-08T12:26:04.247 に答える
0

別のcopyValue(const MyClass & other)関数を使用して、インスタンスの「値」を定義するデータメンバーをコピーしMyClassます。QObjectこれにより、コンパイル時に定義されたクラスの部分を複製しながら、一意のIDの仮定を破ることがなくなります。

于 2011-07-23T14:09:17.657 に答える
-1
QTFruit fruit;
QScriptValue scriptedFruitObject = engine.newQObject(&fruit);
engine.globalObject().setProperty("fruit", scriptedFruitObject);

 engine.setDefaultPrototype(qMetaTypeId<QTFruit>(),
                                scriptedFruitObject);

 QScriptValue qsMetaObject =
        engine.newQMetaObject(fruit.metaObject());
 engine.globalObject().setProperty("eLedState",
                                       qsMetaObject);

int t = engine.evaluate("eLedState.On").toInteger();

engine.evaluate("fruit.fromJScript(1)");
engine.evaluate("fruit.fromJScript(eLedState.On)");

engine.evaluate("fruit.fromJScript(eLedState.TriState)");

//Create the ctor funtion
QScriptValue qsFruitCtor =
        engine.newFunction(QTFruitConstructor,
                                scriptedFruitObject);
//Expose ctor to javascript
 engine.globalObject().setProperty("QTFruit", qsFruitCtor);

 //Create the QTFruit object
engine.evaluate("var res = new QTFruit()");
engine.evaluate("res.fromJScript(eLedState.TriState)");


class QTFruit : public QObject
{
    Q_OBJECT

public:
    enum eLedState { Off, On , TriState};
    Q_ENUMS( eLedState )    
    QTFruit();
    ~QTFruit();
     QTFruit( const QTFruit & other );

    //QTFruit(const QTFruit& other);

public slots:
    void fromJScript(eLedState state);
     //void on_inputSpinBox1_valueChanged(int value);
     //void on_buttonClicked();
//   void fromJScript();
//private:

};
Q_DECLARE_METATYPE(QTFruit*)
Q_DECLARE_METATYPE(QTFruit)

QScriptValue QTFruitConstructor(QScriptContext * /* context */,
                            QScriptEngine *interpreter);
于 2014-12-16T14:37:57.707 に答える
-1

そしてcpp:

QScriptValue QTFruitConstructor(QScriptContext * /* context */,
                            QScriptEngine *interpreter)
{
    //return interpreter->toScriptValue(new QTFruit());
    //or
    return interpreter->toScriptValue(QTFruit()); //but then you need the public copy contructor 
}

 QTFruit::QTFruit( const QTFruit & other )
 : QObject()
{
} 

QTFruit::~QTFruit()
{
}

QTFruit::QTFruit()
{
}

void QTFruit::fromJScript(eLedState state)
{
    int t = 0;
}
于 2014-12-16T14:44:42.563 に答える