Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 使用QGrahicsRectItem拖动大于项本身的矩形_Qt_Draggable_Qgraphicsview_Qgraphicsitem - Fatal编程技术网

Qt 使用QGrahicsRectItem拖动大于项本身的矩形

Qt 使用QGrahicsRectItem拖动大于项本身的矩形,qt,draggable,qgraphicsview,qgraphicsitem,Qt,Draggable,Qgraphicsview,Qgraphicsitem,我对qgraphicscene中的qgraphicsrecitem有问题。我想要的是能够移动鼠标的项目。但问题是,在我的例子中,拖动矩形比项目本身大 以下是我使用的代码: class Test: public QGraphicsView { public: Test(); private: virtual void resizeEvent (QResizeEvent * event); QGraphicsScene* m_pScene; }; Test

我对
qgraphicscene
中的
qgraphicsrecitem
有问题。我想要的是能够移动鼠标的项目。但问题是,在我的例子中,拖动矩形比项目本身大

以下是我使用的代码:

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());
}
类测试:公共QGraphicsView
{
公众:
Test();
私人:
虚拟void resizeEvent(QResizeEvent*事件);
qgraphicscene*m_pScene;
};
Test::Test()
{
m_pScene=新的Qgraphicscene();
setScene(m_pScene);
m_pScene->setscene竖立(0,0,100,100);
对于(int i=0;i<10;i++)
{
qgraphicsrecitem*pItem=新的qgraphicsrecitem();
pItem->setFlag(QGraphicsItem::ItemIsMovable);
pItem->setBrush(QBrush(QColor(190100100));
pItem->setRect(QRectF(10*i,10,5,80.f));
pItem->setCursor(Qt::sizealcursor);
m_pScene->addItem(pItem);
}
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
调整大小(600200);
fitInView(scene()->scene());
show();
}
无效测试::resizeEvent(QResizeEvent*事件)
{
QGraphicsView::resizeEvent(事件);
fitInView(scene()->scene());
}
所以当我运行我的程序时,我有这个窗口,我可以拖动项目。一切似乎都很好

但是如果我仔细看,拖拽区域比物品本身要大。(参见下面屏幕截图上的蓝色矩形)蓝色矩形意味着如果我在这个矩形中移动鼠标,光标就会改变,我可以拖动项目

我感觉问题与“fitInView(scene()->scene直立());”行有关。如果我移除它,它就会工作。 例如,如果我添加一个“刻度(5,1)”,则存在相同的问题


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

我想您遇到了以下问题:

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


我已提交修复/合并请求。您可以修改Qt源代码使其暂时可用。如果将KeepSpectratio添加到FitView调用,会发生什么?它仍然有错误的拖动矩形吗?在转换后,绘制矩形和拖动矩形似乎不同步。谢谢您的帮助!所以这是QT中的一个bug,我可以搜索很长时间。QT通常非常稳定,以至于我没有想到它会是一个bug:)不幸的是,我没有时间,必须找到解决方案,所以我创建了自己的GraphicsView、Graphicscene和GraphicsSitem,使用自己的选择、移动和调整大小算法:(我发现这不仅仅是一个点上的一个bug。在整个图形视图/场景中,它使用1x1正方形进行点测试。QGraphicscene及其支持类实际上有专门的代码来测试项目中的点。不知何故,没有人在使用它。使用矩形代替数学上大小为零的点,无论矩形多么小,都是错误的。)必然会导致错误。