我希望有一个基于图像的拖放功能。如果我拖放图像,我想知道我选择和移动的图像(一个简单的std :: string将唯一标识该图像所代表的对象)。我的想法是在QGraphicsScene中存储我自己的对象(QPixmapItem):
#ifndef QPIXMAPITEM_H
#define QPIXMAPITEM_H
#include <QGraphicsPixmapItem>
#include <QPoint>
class QPixmapItem : public QGraphicsPixmapItem
{
public:
QPixmapItem(std::string path, std::string id, int x, int y);
std::string getIdentifier (){return this->identifier;}
QPoint getPosition () const{return this->position;}
private:
std::string identifier;
QPoint position;
};
#endif // QPIXMAPITEM_H
这是我用来将对象添加到场景的方法:
void MainWindow::addPixmapItemToScene(std::string path, int x, int y)
{
// generate pixmap item & add it to the scene
QPixmapItem *item = new QPixmapItem(path, std::string("id123"), x, y);
ui->roomView->scene()->addItem(item);
// only update the affected area
ui->roomView->updateSceneRect(item->pixmap().rect());
}
以下是我尝试在QMouseEvent中“捕获”对象的方法:
void MainWindow::mousePressEvent(QMouseEvent *event)
{
std::cout << "mouse pressed" << std::endl;
QGraphicsPixmapItem *currentItem = dynamic_cast<QGraphicsPixmapItem *>(childAt(event->pos()));
if (!currentItem) {
return;
}
std::cout << "item pressed" << std::endl;
}
正在将对象添加到场景中,但每当我按下它们时,最后一行(“按下的项目”)永远不会进入屏幕..
答案 0 :(得分:1)
QGraphicsItem
已经支持在QGraphicsScene
内通过拖放进行移动。您只需设置QGraphicsItem::ItemIsMovable
标志。
如果您希望在发生这种情况时收到通知,请覆盖自定义QGraphicsItem
中的QGraphicsItem::itemChange()
。
答案 1 :(得分:0)
childAt()将无效,因为它返回QWidget,而QGraphicsPixMapItems不是QWidgets(因此,childAt()永远不会返回指向任何类型的QGraphicsItem的指针,即使它以某种方式执行,dynamic_cast转换也会返回NULL反正)。
为了获得与场景中指定点相交的QGraphicsItem列表,请在场景对象上调用QGraphicsScene::items()。然后遍历返回的列表,找出QGraphicsPixMapItems(如果有的话)。