我有几个不同的类派生自QGraphicsItem
其子类(如QGraphicsRectItem
)。我现在需要复制这些类的选定对象,但不知道我复制的是哪一个。
由于QGraphicsScene::selectedItems()
返回一个选定项目的列表,我决定使用它,但是我不能复制它,QGraphicsItem
因为它是一个抽象类。为了解决这个问题,我尝试使用malloc
and复制对象memcpy
。
主窗口.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; } }
主窗口.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
,因为这是一项小组工作,我不想破坏其他功能。