Мой простой код основывается на стандартном примере Qt «Сцена диаграммы». MainWindow наиболее просто, загружать только пользовательские сцены. Пользовательский интерфейс в графическом редакторе.
Перетащите графический полигон с помощью правой кнопки мыши, влево создайте новый элемент. Так?
Я должен дважды щелкнуть по пункту для выбора. И элемент нужно дважды щелкнуть без последнего нажатия кнопки, когда я хочу переместить элемент. Полное головокружение.
Код изделия:
BasicDiagramItem::BasicDiagramItem(QGraphicsItem *parent):
QGraphicsPolygonItem(parent)
{
drawCustomPoly();
}
void BasicDiagramItem::drawCustomPoly()
{
QPainterPath path;
customPoly << QPointF(0,50) << QPointF(50,0)
<< QPointF(0,-50) << QPointF(-50,0)
<< QPointF(0,50);
setPolygon(customPoly);
setFlag(QGraphicsItem::ItemIsMovable, true);
setFlag(QGraphicsItem::ItemIsSelectable, true);
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
//setFlag(QGraphicsItem::ItemClipsToShape,true); //testowe
}
void BasicDiagramItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
QGraphicsPolygonItem::mouseMoveEvent(event);
}
Код сцены:
DiagramScene::DiagramScene(QObject *parent):
QGraphicsScene(parent)
{
}
void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if(mouseEvent->button() != Qt::RightButton) return;
BasicDiagramItem *item;
item = new BasicDiagramItem();
//item->setBrush()
addItem(item);
item->setPos(mouseEvent->scenePos());
QGraphicsScene::mousePressEvent(mouseEvent);
}
void DiagramScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
QGraphicsScene::mouseMoveEvent(mouseEvent);
}
void DiagramScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
QGraphicsScene::mouseReleaseEvent(mouseEvent);
}
Этот код похож на пример Qt. Я просто не использую режим для создания другого объекта, не использую меню Cutom, и я не рисую стрелки.
Итак, что я делаю не так? Почему в приложениях есть ошибка с двойным щелчком мыши?
Итак, что я делаю не так? Почему в приложениях есть ошибка с двойным щелчком мыши?
Я думаю, что это причина:
void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if(mouseEvent->button() != Qt::RightButton) return;
Обратите внимание, что при щелчке левой кнопкой мыши mousePressEvent () просто возвращается, ничего не делая; это объясняет, почему ничего не происходит, когда вы щелкаете левой кнопкой мыши. (При двойном щелчке OTOH вызывается mouseDoubleClickEvent (), и, поскольку вы не переопределили mouseDoubleClickEvent (), вызывается метод QGraphicsScene :: mouseDoubleClickEvent (), который обрабатывает щелчок там.
Я думаю, что вы хотите сделать вместо этого:
void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if(mouseEvent->button() != Qt::RightButton)
{
QGraphicsScene::mousePressEvent(mouseEvent); // call up to superclass
return;
}
[...]
Таким образом, QGraphicsScene :: mousePressEvent (mouseEvent) может выполнять работу по выбору элемента, по которому щелкнул пользователь.
Других решений пока нет …