QGraphicsScene with QGraphicsPixmapItems - Задержки выбора

В настоящее время я пытаюсь реализовать какое-то приложение "перетаскивания" с QGraphicsPixmapItems в QGraphicsScene который работает очень хорошо в целом (вы можете узнать графику из какой-то игры;)).

К сожалению, есть какая-то проблема задержки выделения, от которой я не могу реально объяснить или избавиться: если я выполняю первый выбор мышью для каждого элемента, существует небольшая задержка, пока не будет выполнен фактический выбор или не будет перемещен перетаскиваемый элемент., Вы можете увидеть это "в действии" в следующей анимации:

Задержка выбора

Код не очень длинный и должен быть самообъяснимым, а также минимальным, полным и проверяемым

Система Win64 с Qt 5.9.2 и компилятором MSVC32bit.

Какие-либо предложения?

Вот фактический код:

mactionitem.h

#ifndef MACTIONITEM_H
#define MACTIONITEM_H
//---------------------------------------------------------------------------

#include <QGraphicsPixmapItem>
//---------------------------------------------------------------------------

class MActionItem : public QGraphicsPixmapItem
{
public:
    MActionItem(
        const QPixmap &pixmap,
        const QRectF &imgRect,
        QGraphicsItem *parent = nullptr
        )
        :   m_imgRect(imgRect),
            QGraphicsPixmapItem(pixmap, parent)
    {
    }

private:
    QRectF boundingRect() const override
    {
        return QRectF(0.0, 0.0, m_imgRect.width(), m_imgRect.height());
    }

    void paint(
        QPainter *painter, 
        const QStyleOptionGraphicsItem *option, 
        QWidget *widget
        ) override
    {
        painter->drawPixmap(
            QPointF(0.0, 0.0),
            pixmap(),
            m_imgRect
            );

        if (isSelected())
        {
            QPen p = painter->pen();

            p.setColor(Qt::red);

            painter->setPen(p);

            painter->drawRect(0.0, 0.0, m_imgRect.width(), m_imgRect.height());
        }
    }

    void advance(int phase) override
    {
        // Skip, if we're not in the 'drawing' phase
        if (!phase)
            return;
    }

    QRectF m_imgRect;
};
//---------------------------------------------------------------------------

#endif // MACTIONITEM_H

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
//---------------------------------------------------------------------------

#include <QMainWindow>
#include <QGraphicsScene>
//---------------------------------------------------------------------------

namespace Ui{
class MainWindow;
}
//---------------------------------------------------------------------------

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr)
        :   QMainWindow(parent),
            ui(new Ui::MainWindow)
    {
        ui->setupUi(this);

        m_scene.setSceneRect(ui->graphicsView->rect());

        ui->graphicsView->setScene(&m_scene);
        ui->graphicsView->setBackgroundBrush(QBrush(Qt::black, Qt::SolidPattern));

        // ...activate anti-aliasing
        ui->graphicsView->setRenderHint(QPainter::Antialiasing);

        // ...set the rubber band selection mode
        ui->graphicsView->setDragMode(QGraphicsView::RubberBandDrag);

        for (auto i = 0; i < 20; ++i)
        {
            int tile = (rand() % static_cast<int>(32)) * 32;

            MActionItem *block = new MActionItem(QPixmap(":/common/tex16.png"), QRectF(tile, 0.0, 32.0, 32.0));

            m_scene.addItem(block);

            block->setPos(i * 32.0, 0.0);
            block->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
        }
    }

    ~MainWindow()
    {
        delete ui;
    }

private:
    Ui::MainWindow *ui;

    QGraphicsScene m_scene;
};
//---------------------------------------------------------------------------

#endif // MAINWINDOW_H

0 ответов

Другие вопросы по тегам