我有一个添加到graphicsView的场景中的QGraphicsView和QGraphicsItem。我覆盖QGraphicsView wheelEvent来执行缩放视图,但我希望我的图形项目宽度不变。
为此,我在图形项目paint函数中为pen设置了cosmetic。它工作得很好,但经过一定的规模后,化妆品功能不起作用,图形项宽度开始增长。
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的滚动条跳到视图的左上角。
发布于 2019-04-09 15:22:55
默认情况下,QGraphicsItem根据视图转换进行调整。
您可以通过在MyGraphicsItem构造函数中添加setFlag(QGraphicsItem::ItemIgnoresTransformations);来忽略它。放大/缩小时,您的项目将不会缩放。
https://stackoverflow.com/questions/55546918
复制相似问题