用鼠标在QGraphicsView/QGraphicsScene上移动项目



我有一个QGraphicsView区域,其中显示一些Item项。我想实现鼠标移动。

class Item
{
public:
    Item();
    void update();
    int x, y; // position
    int z; // order - should correspond also to index in item list
};
class Collection : public QGraphicsView
{
Q_OBJECT
public:
    Collection(QWidget *parent = 0);
    void update();
    QList<Item> *m_items;
protected:
    virtual void paintEvent(QPaintEvent * event);
    virtual void mousePressEvent(QMouseEvent * event);
    virtual void mouseReleaseEvent(QMouseEvent *event);
private:
    QPoint offset;
    int itemMoved;
};

尝试:

void Collection::mousePressEvent(QMouseEvent* event)
{
    Item *currentItem = NULL;
    itemMoved = -1;
    foreach (QGraphicsItem *item, this->items(event->pos()))
    {
// never get into this loop since my items are not children of QGraphicsItem
        currentItem = dynamic_cast<Item*>(item);
        if (event->button() == Qt::LeftButton && currentItem)
        {
            itemMoved = currentItem->z;
            offset = event->pos();
        }
        else if (event->button() == Qt::RightButton)
        {
            // set right click stuff
        }
        else
        {
            event->ignore();
        }
        break;
    }
}
void CollectionView::mouseReleaseEvent(QMouseEvent* event)
{
    if(event->button() == Qt::LeftButton && itemMoved > 0)
    {
        m_items->at(itemMoved).x = event->pos().x();
        m_items->at(itemMoved).y = event->pos().y();
// So far multiple fails:
//    error: assignment of data-member 'Item::x' in read-only structure
//    error: assignment of data-member 'Item::y' in read-only structure
//    error: passing 'const Item' as 'this' argument of 'void Item::update()' discards qualifiers
        m_items->at(itemMoved).update();
        update();
    }
}

我会让我的Item继承QGraphicsItem,但后来我在不知道如何定义的虚拟函数方面遇到了错误(比如boundingRect,它取决于项目内容……可以是对象、图像、svg、文本……对一些人来说,我知道如何获得边界矩形,但对另一些人来说真的是idk)。。。这是唯一的方法吗?

我如何识别鼠标位置的项目,是什么阻止我在移动鼠标后更改项目的xy

如果您要自己实现所有内容,则根本不应该使用QGraphicsView。如果您希望使用QGraphicsView,则无需重新实现其任何虚拟方法。只需按原样使用它,并设置项目的QGraphicsItem::ItemIsMovable标志。

这个答案提供了一个完整的例子。重新实施QGraphicsView::mousePressEvent的唯一原因是实现新项目的创建。

相关内容

  • 没有找到相关文章

最新更新