Qt QGraphicsView Scrolling 导致项目随机消失

问题描述

我遇到了一个奇怪的错误,它在您调整 QGraphicsItem 的大小后发生。 以下是显示该问题的 YouTube 视频:https://youtu.be/gp1lQTkPf54

在我的应用程序中,使用滑块来调整 QGraphicsScene 上所有区域的水平缩放。我已确保在更改区域的几何形状时调用 prepareGeometryChange();调用 update(); 但这并没有帮助。它似乎会影响正在呈现在用户视野之外的区域。

代码

mainwindow.cpp

#include "mainwindow.h"
#include "./ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QGraphicsScene *scene = new QGraphicsScene(this);
    ui->graphicsView->setScene(scene);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    RegionGraphicsItem *rgi = new RegionGraphicsItem(ui->graphicsView->scene());
    itemList.append(rgi);
    ui->graphicsView->scene()->addItem(rgi);
    rgi->setHScaleFactor(ui->horizontalSlider->value());
}

void MainWindow::test() {
    QWidget test;
    test.show();
}

void MainWindow::on_horizontalSlider_valueChanged(int value)
{
    for (int i = 0; i < itemList.size(); i++) {
        itemList[i]->setHScaleFactor(value);
    }

}

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "regiongraphicsitem.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    QList<RegionGraphicsItem*> itemList;

private slots:
    void on_pushButton_clicked();
    void on_horizontalSlider_valueChanged(int value);

private:
    void test();
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

regiongraphicsitem.cpp

#include "regiongraphicsitem.h"

RegionGraphicsItem::RegionGraphicsItem(QGraphicsScene *_scene) : QGraphicsItem()
{
    regionColor = QColor::fromrgb(255,255,255);
    setFlags(ItemIsMovable);
    waveFormColor = regionColor.darker(80);

    outlineColor = QColor("#0f0f0f");
    selectedColor = selectedColor.lighter(30);

    hScaleFactor = 100;
    mainBrush = QBrush(regionColor);
    mainPen = QPen(outlineColor,1);

    gridLength = 5;
    height = 56;
    oldPos = pos();
    scene = _scene;

    this->prepareGeometryChange();
    gridLocation = 5;
    setY((0 * 60) + 1);
}


QRectF RegionGraphicsItem::boundingRect() const
{
    return QRectF(0,float(gridLength * hScaleFactor),float(height));
}

void RegionGraphicsItem::paint(QPainter *painter,const qstyleOptionGraphicsItem *option,QWidget *widget)
{
    Q_UNUSED(widget);

    QRectF rect = boundingRect();

    painter->setBrush(mainBrush);
    painter->setPen(mainPen);
    painter->drawRoundedRect(rect,5,5);

    painter->setPen(mainPen);

    if (selected) {
        painter->setBrush(QBrush(mainPen.color()));
        painter->drawRoundedRect(QRect(rect.x(),rect.y(),rect.width(),20),5);
        painter->drawRect(QRect(rect.x(),rect.y() + 5,15));
    }


    QFont font = scene->font();
    font.setPixelSize(10);
    font.setBold(true);
    QFontMetricsF fontMetrics(font);
    QString text = "TEST";
    int heightFont = fontMetrics.boundingRect(text).height();
    if (selected) {
        painter->setPen(QPen(mainBrush.color(),1));
    }
    painter->drawText(5,heightFont + 3,text);
    if (pressed == false ) {
        setX((gridLocation - 1) * hScaleFactor);
    }
}


void RegionGraphicsItem::setHScaleFactor(int value) {
    prepareGeometryChange();
    hScaleFactor = value;
    update();
}


regiongraphicsitem.h

#ifndef RegionGraphicsItem_H
#define RegionGraphicsItem_H

#include <QGraphicsItem>
#include <QColor>
#include <QBrush>
#include <QPen>
#include <QtGui/QPainter>
#include <QGraphicsScene>
#include <QGraphicsSceneMouseEvent>

#include <QDebug>
#include <stdint.h>

class RegionGraphicsItem : public QGraphicsItem
{
public:
    RegionGraphicsItem(QGraphicsScene *_scene);
    float getGridLocation();
    void setHScaleFactor(int value);

protected:

    QColor outlineColor;
    QColor selectedColor;
    QColor regionColor;
    QColor waveFormColor;

    bool selected;

    int penWidth;
    int rounded;

    QBrush mainBrush;
    QBrush waveformBrush;
    QPen mainPen;

    int height;
    float gridLength;

    bool pressed = false;
    QPointF oldPos,oldMousePos;
    int oldTrackIndex;
    float gridLocation;
    QGraphicsScene *scene;

    int oldHScaleFactor;

    virtual QRectF boundingRect() const override;
    virtual void paint(QPainter *painter,QWidget *widget) override;

private:
    int hScaleFactor;

};

#endif // RegionGraphicsItem_H

重现步骤:

  1. RegionGraphicItem 添加QGraphicsScene
  2. 增加滑块直到该区域离开屏幕
  3. 减小滑块,区域将不可见。

Animated image showing the region not appearing when re-adjusting the size

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)