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