Menyeret persegi panjang yang lebih besar dari item itu sendiri menggunakan QGrahicsRectItem

Saya punya masalah dengan QGrahicsRectItem di QGraphicsScene. Yang saya inginkan adalah bisa memindahkan item dengan mouse. Tapi masalahnya adalah dalam kasus saya, persegi panjang yang diseret lebih besar dari item itu sendiri.

Berikut kode yang saya gunakan:

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

Jadi ketika saya menjalankan program saya, saya mempunyai jendela ini, dan saya dapat menyeret item. Semuanya tampak baik-baik saja.

layar1

Tetapi jika saya melihat lebih dekat zona seretnya lebih besar dari item itu sendiri. (lihat persegi panjang biru pada tangkapan layar berikut) Persegi panjang biru berarti Jika saya menggerakkan mouse di dalam persegi panjang ini, kursor akan berubah, dan saya dapat menyeret item tersebut.

layar2

Saya merasa masalahnya terkait dengan “fitInView(scene()->sceneRect());” garis. Jika saya menghapusnya, maka itu berhasil. Jika saya menambahkan 'skala(5,1)' misalnya, ada masalah yang sama.

Apakah Anda tahu apa masalahnya?


person penpen    schedule 28.03.2011    source sumber
comment
Apa yang terjadi jika Anda menambahkan KeepAspectRatio ke panggilan fitInView? Apakah masih ada salah drag rect? Sepertinya paint rect dan drag rect entah bagaimana tidak sinkron setelah transformasi.   -  person Stephen Chu    schedule 28.03.2011


Jawaban (1)


Saya pikir Anda menemukan bug ini: http://bugreports.qt-project.org/browse/QTBUG-17985

Apa yang terjadi adalah Qt menggunakan adegan persegi panjang berukuran 1x1 untuk menguji apakah item berada di bawah kursor. Dalam kasus Anda (dan saya), 1 unit dalam adegan lebih besar dari 1 piksel di layar. Jadi persegi panjang 1x1 menutupi lebih dari 1 piksel dari kursor, dan menyentuh item yang tidak berada di bawah kursor.

Saya telah mengirimkan permintaan perbaikan/penggabungan. Anda dapat memodifikasi sumber Qt Anda agar berfungsi untuk saat ini

person Stephen Chu    schedule 01.04.2011
comment
Terimakasih atas bantuannya! Jadi itu bug di QT, saya bisa mencarinya lama sekali. QT biasanya sangat stabil sehingga saya tidak membayangkan itu mungkin bug :) Sayangnya saya tidak punya waktu, dan harus mencari solusi, jadi saya membuat GraphicsView, GraphicsScene, dan GraphicsItem saya sendiri, dengan pilihan saya sendiri, pindahkan, mengubah ukuran algoritma :( - person penpen; 02.04.2011
comment
Saya menemukan bahwa ini lebih dari satu bug di satu tempat. Sepanjang tampilan grafis/adegan, menggunakan kotak 1x1 untuk pengujian titik. QGraphicsScene dan kelas pendukungnya sebenarnya memiliki kode khusus untuk menguji suatu titik dalam suatu item. Entah bagaimana tidak ada yang menggunakannya. Menggunakan persegi panjang pada titik yang secara matematis berukuran nol, betapapun kecilnya persegi panjang tersebut, pasti akan menyebabkan kesalahan. - person Stephen Chu; 03.04.2011