การลากสี่เหลี่ยมที่ใหญ่กว่ารายการโดยใช้ QGrahicsRectItem

ฉันมีปัญหากับ QGrahicsRectItem ใน QGraphicsScene สิ่งที่ฉันต้องการคือสามารถย้ายรายการด้วยเมาส์ได้ แต่ปัญหาคือในกรณีของฉัน สี่เหลี่ยมสำหรับการลากนั้นใหญ่กว่าตัวรายการเอง

นี่คือรหัสที่ฉันใช้:

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());
}

ดังนั้นเมื่อฉันรันโปรแกรม ฉันจะมีหน้าต่างนี้ และฉันสามารถลากรายการต่างๆ ได้ ดูเหมือนทุกอย่างจะโอเค

screen1

แต่หากมองใกล้ ๆ โซนการลากจะใหญ่กว่าตัวไอเท็มเอง (ดูภาพสี่เหลี่ยมสีน้ำเงินในภาพหน้าจอต่อไปนี้) สี่เหลี่ยมสีน้ำเงินหมายความว่า ถ้าฉันเลื่อนเมาส์ในสี่เหลี่ยมนี้ เคอร์เซอร์จะเปลี่ยนไป และฉันสามารถลากรายการได้

screen2

ฉันรู้สึกว่าปัญหาเกี่ยวข้องกับ “fitInView(scene()->sceneRect());” เส้น. ถ้าฉันลบมันออกไป มันก็ใช้งานได้ ถ้าฉันเพิ่ม 'มาตราส่วน (5,1)' แสดงว่ามีปัญหาเดียวกัน

คุณมีความคิดว่าปัญหาอาจเกิดขึ้นได้อย่างไร?


person penpen    schedule 28.03.2011    source แหล่งที่มา
comment
จะเกิดอะไรขึ้นถ้าคุณเพิ่ม KeepAspectRatio ให้กับการโทรแบบ fitInView มันยังคงมีการแก้ไขการลากผิดหรือไม่? ดูเหมือนว่าการแก้ไขสีและการแก้ไขการลากจะไม่ซิงค์กันหลังจากการแปลง   -  person Stephen Chu    schedule 28.03.2011


คำตอบ (1)


ฉันคิดว่าคุณประสบปัญหานี้: http://bugreports.qt-project.org/browse/QTBUG-17985

สิ่งที่เกิดขึ้นคือ Qt ใช้ฉากสี่เหลี่ยมที่มีขนาด 1x1 เพื่อทดสอบว่ารายการอยู่ใต้เคอร์เซอร์หรือไม่ ในกรณีของคุณ (และฉัน) 1 ยูนิตในฉากมีขนาดใหญ่กว่า 1 พิกเซลบนหน้าจอ ดังนั้น สี่เหลี่ยมขนาด 1x1 จึงครอบคลุมพื้นที่มากกว่า 1 พิกเซลจากเคอร์เซอร์ และสัมผัสรายการที่ไม่อยู่ใต้เคอร์เซอร์

ฉันได้ส่งคำขอแก้ไข/รวมแล้ว คุณสามารถแก้ไขแหล่งที่มา Qt ของคุณเพื่อให้ใช้งานได้ในตอนนี้

person Stephen Chu    schedule 01.04.2011
comment
ขอบคุณที่ช่วยเหลือ! มันเป็นข้อผิดพลาดใน QT ฉันสามารถค้นหาได้เป็นเวลานาน ปกติแล้ว QT จะมีความเสถียรมากจนไม่คิดว่ามันจะเป็นข้อผิดพลาด :) โชคไม่ดีที่ฉันไม่มีเวลาและต้องหาทางแก้ไข ดังนั้นฉันจึงสร้าง GraphicsView, GraphicsScene และ GraphicsItem ของตัวเองขึ้นมา โดยเลือก ย้าย ปรับขนาดอัลกอริธึม :( - person penpen; 02.04.2011
comment
ฉันพบว่ามีข้อบกพร่องมากกว่าหนึ่งจุดในจุดเดียว ตลอดทั้งมุมมองกราฟิก/ฉาก จะใช้สี่เหลี่ยมจัตุรัส 1x1 สำหรับการทดสอบจุด QGraphicsScene และคลาสสนับสนุนมีโค้ดพิเศษสำหรับการทดสอบจุดในรายการ อย่างใดไม่มีใครใช้มัน การใช้สี่เหลี่ยมในตำแหน่งที่มีขนาดเป็นศูนย์ในทางคณิตศาสตร์ ไม่ว่าสี่เหลี่ยมนั้นจะเล็กแค่ไหนก็ตาม ย่อมทำให้เกิดข้อผิดพลาดได้ - person Stephen Chu; 03.04.2011