QGraphicsItem
またはその子から派生したいくつかの異なるクラスがあります(のようにQGraphicsRectItem
)。どのクラスをコピーするのか正確にわからないまま、これらのクラスの選択したオブジェクトをコピーする必要があるときです。
選択したアイテムのリストを返すので、それを使用することにしましたが、抽象クラスでQGraphicsScene::selectedItems()
あるためコピーできません。QGraphicsItem
これに対処するために、 and を使用してオブジェクトをコピーしようとしていmalloc
ますmemcpy
。
MainWindow.cpp
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); scene = new QGraphicsScene(); item = new QGraphicsRectItem(50,50,50,50); item->setFlag(QGraphicsItem::ItemIsSelectable); scene->addItem(item); item->setSelected(true); ui->graphicsView->setScene(scene); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { for(QGraphicsItem *item : scene->selectedItems()) { QGraphicsItem *copiedItem=(QGraphicsItem *)malloc(sizeof(*item)); memcpy(copiedItem, item, sizeof(*copiedItem)); copiedItem->moveBy(50, 50); scene->addItem(copiedItem); qDebug() << item; qDebug() << copiedItem; } }
MainWindow.h
namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); QGraphicsScene *scene; QGraphicsRectItem *item; private slots: void on_pushButton_clicked(); private: Ui::MainWindow *ui; };
この例では、QGraphicsView と QPushButton で構成される GUI で十分です。
このコードは機能しているようで、item
アドレスcopiedItem
は異なりますが、戻り値と同じプロパティを持っていqDebug()
ます。
ただし、シーンは次のエラーを返します。
QGraphicsScene::addItem: item has already been added to this scene
住所が違うのに同じものだとシーンが考える理由がよくわかりません。この問題を解決する方法はありますか?
編集: 可能であればQGraphicsItem
、から派生したクラスのコードを変更せずにこれを行いたいと考えています。これはグループ作業であり、他の機能をバグにしたくないためです。