12

私は Qt を使用しており、いくつかの実際の基本的な問題があります。変数を持つ独自のウィジェット MyTest を作成しましたobjobj変数が別のオブジェクトへのポインターだけでなくコピーされるように、ウィジェットの外部のオブジェクトからこの変数を設定する必要があります。エラー メッセージが表示され、この基本的な操作を行う方法がわかりません。これは私が使用しているコードです:

MyTest.h:

class MyTest : public QWidget
{
    Q_OBJECT

    public:
        void setObj(QObject &inobj);

        QObject obj;
    ....
}

MyTest.cpp:

void MyTest::setObj(QObject &inobj) {
    obj = inobj; //HERE I get the error message: "illegal access from 'QObject' to protected/private member 'QObject::operator=(const QObject &)'"
}

main.cpp:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QObject *ob = new QObject();

    MyTest w;
    w.setObj(*ob);
}
4

3 に答える 3

26

コピーコンストラクタと代入演算子が無効になっているようです。これから。_

コピー コンストラクターまたは代入演算子がない

QObject には、コピー コンストラクターも代入演算子もありません。これは仕様によるものです。実際には、それらは宣言されていますが、マクロ Q_DISABLE_COPY() を持つプライベート セクションにあります。実際、QObject (直接または間接) から派生したすべての Qt クラスは、このマクロを使用して、コピー コンストラクターと代入演算子をプライベートとして宣言します。その理由は、Qt Object ModelページのIdentity vs Valueに関する議論にあります。

主な結果は、QObject (または QObject サブクラス) へのポインターを使用する必要があるということです。そうしないと、QObject サブクラスを値として使用したくなる可能性があります。たとえば、コピー コンストラクターがないと、コンテナー クラスの 1 つに格納される値として QObject のサブクラスを使用できません。ポインタを格納する必要があります。

于 2010-04-16T11:43:26.773 に答える
5

Aaron は、代入演算子の使用について正しいです。

私が知っているオブジェクトのコピーを作成する唯一の方法は、QDataStream クラスで説明されているようにシリアル化を使用することです。これにより、オブジェクトのディープ コピーが作成されます。

または、安全に渡すことができる QSharedPointer ポインターとしてクラスをラップすることを検討しましたか。ただし、これはオブジェクトのシャドウまたは参照コピーになります。

于 2010-04-16T15:36:02.980 に答える