【问题标题】:Dragging rectangle bigger than item itself using QGrahicsRectItem使用 QGrahicsRectItem 拖动大于项目本身的矩形
【发布时间】:2014-05-01 00:06:06
【问题描述】:

我对@9​​87654324@ 中的QGrahicsRectItem 有疑问。我想要的是能够用鼠标移动项目。但问题是,在我的情况下,拖动的矩形比项目本身大。

这是我使用的代码:

class Test: public QGraphicsView
{
    public:
    Test();

    private:
    virtual void resizeEvent (QResizeEvent * event);
    QGraphicsScene* m_pScene;
};

Test::Test()
{
    m_pScene = new QGraphicsScene();
    setScene(m_pScene);

    m_pScene->setSceneRect(0, 0, 100, 100);

    for (int i = 0 ; i < 10 ; i++)
    {
        QGraphicsRectItem * pItem = new QGraphicsRectItem();
        pItem->setFlag(QGraphicsItem::ItemIsMovable);
        pItem->setBrush(QBrush(QColor(190, 100, 100)));
        pItem->setRect(QRectF(10*i, 10, 5, 80.f));
        pItem->setCursor(Qt::SizeAllCursor);
        m_pScene->addItem(pItem);
    }


    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    resize(600, 200);
    fitInView(scene()->sceneRect());
    show();
}

void Test::resizeEvent(QResizeEvent * event)
{
    QGraphicsView::resizeEvent(event);
    fitInView(scene()->sceneRect());
}

所以当我运行我的程序时,我有这个窗口,我可以拖动项目。一切似乎都很好。

但如果我仔细观察,拖动区域比项目本身大。 (见下图蓝色矩形)蓝色矩形表示如果我在这个矩形中移动鼠标,光标会改变,我可以拖动项目。

我感觉问题与“fitInView(scene()->sceneRect());”有关线。如果我删除它,那么它可以工作。 例如,如果我添加一个“scale(5,1)”,就会出现同样的问题。

你知道问题可能是什么吗?

【问题讨论】:

  • 如果将 KeepAspectRatio 添加到 fitInView 调用中会发生什么?它仍然有错误的拖动矩形吗?看起来绘画矩形和拖动矩形在转换后不知何故不同步。

标签: qt draggable qgraphicsview qgraphicsitem


【解决方案1】:

我认为你遇到了这个错误:http://bugreports.qt-project.org/browse/QTBUG-17985

Qt 使用 1x1 大小的场景矩形来测试项目是否在光标下。在您(和我)的情况下,场景中的 1 个单位大于屏幕上的 1 个像素。所以 1x1 的矩形覆盖了距离光标超过 1 个像素,并接触到了不在光标下的项目。

我已提交修复/合并请求。您可以修改您的 Qt 源代码,使其暂时可用。有

【讨论】:

  • 感谢您的帮助!所以这是QT中的一个错误,我可以搜索很长时间。 QT 通常非常稳定,以至于我没有想到它可能是一个错误 :) 不幸的是我没有时间,不得不寻找解决方案,所以我创建了自己的 GraphicsView、GraphicsScene 和 GraphicsItem,用我自己的选择、移动、调整大小算法:(
  • 我发现它不仅仅是一个地方的一个错误。通过图形视图/场景,它使用 1x1 正方形进行点测试。 QGraphicsScene 及其支持类实际上具有用于测试项目中的点的特殊代码。不知何故,没有人在使用它。使用矩形放置一个数学上大小为零的点,无论矩形多么小,都会导致错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多