>

GraphicsView와 graphicsView의 장면에 추가 된 QGraphicsItem이 있습니다. QGraphicsView wheelEvent를 재정 의하여 스케일보기를 수행하지만 그래픽 항목 너비가 변경되지 않기를 원합니다.

이를 위해 그래픽 항목 페인트 기능에서 펜에 코스메틱을 true로 설정했습니다. 제대로 작동하지만 약간의 확대 후에는 장식 기능이 작동하지 않고 그래픽 항목 너비가 커지기 시작합니다.

MyGraphicsItem.h

#include <QGraphicsItem>
class MyGraphicsItem : public QGraphicsItem
{
public:
    MyGraphicsItem();
    void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget);
    QRectF boundingRect() const;
};

MyGraphicsItem.cpp

#include "MyGraphicsItem.h"
#include <QPen>
#include <QPainter>
MyGraphicsItem::MyGraphicsItem()
{
}
void MyGraphicsItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
    QPen pen;
    pen.setColor(Qt::black);
    pen.setCosmetic(true);
    painter->setPen(pen);
    painter->drawLine(QPointF(0, 250), QPointF(500, 250));
}
QRectF MyGraphicsItem::boundingRect() const
{
    return QRectF(0, 0, 500, 500);
}

MyGraphicsView.h

#include <QGraphicsView>
class MyGraphicsView : public QGraphicsView
{
public:
    MyGraphicsView();
    void wheelEvent(QWheelEvent* event);
};

MyGraphicsView.cpp

#include "MyGraphicsView.h"
#include <QtMath>
#include <QDebug>
#include <QGLFormat>
#include <QWheelEvent>
#include <QStyleOptionGraphicsItem>
MyGraphicsView::MyGraphicsView()
{
    setScene(new QGraphicsScene(0, 0, 500, 500));
    setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
    setViewport(new QGLWidget);
}
void MyGraphicsView::wheelEvent(QWheelEvent* event)
{
    qreal s = qPow(2, event->delta() / 120 / 4.0);
    scale(s, s);
}

MainWindow.h

#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    Ui::MainWindow *ui;
};

MainWindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "MyGraphicsItem.h"
#include "MyGraphicsView.h"
MainWindow::MainWindow(QWidget* parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    auto view = new MyGraphicsView;
    view->scene()->addItem(new MyGraphicsItem);
    setCentralWidget(view);
}
MainWindow::~MainWindow()
{
    delete ui;
}

main.cpp

#include "MainWindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

모든 제안이 있으십니까?

내가 본 또 다른 문제는 페인트 선에서 (확대) 확대 된 후 QGraphicsView의 스크롤 막대가 왼쪽 상단으로 점프한다는 것입니다.


  • 답변 # 1

    기본적으로 QGraphicsItem  조회수 전환에 따라 조정됩니다.

    setFlag(QGraphicsItem::ItemIgnoresTransformations); 를 추가하면 무시할 수 있습니다  당신의 MyGraphicsItem 에서  건설자. 확대/축소 할 때 항목의 크기가 조정되지 않습니다.

  • 이전 java - 쉼표로 구분 된 레코드를 문자열 배열로?
  • 다음 Java에서 상수 객체를 어떻게 만듭니 까?