首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QPen setCosmetic在高QGraphicsView规模下不起作用

QPen setCosmetic在高QGraphicsView规模下不起作用
EN

Stack Overflow用户
提问于 2019-04-06 15:41:06
回答 1查看 300关注 0票数 2

我有一个添加到graphicsView的场景中的QGraphicsView和QGraphicsItem。我覆盖QGraphicsView wheelEvent来执行缩放视图,但我希望我的图形项目宽度不变。

为此,我在图形项目paint函数中为pen设置了cosmetic。它工作得很好,但经过一定的规模后,化妆品功能不起作用,图形项宽度开始增长。

MyGraphicsItem.h

代码语言:javascript
复制
#include <QGraphicsItem>

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

MyGraphicsItem.cpp

代码语言:javascript
复制
#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

代码语言:javascript
复制
#include <QGraphicsView>

class MyGraphicsView : public QGraphicsView
{
public:
    MyGraphicsView();
    void wheelEvent(QWheelEvent* event);
};

MyGraphicsView.cpp

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#include "MainWindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

有什么建议吗?

我看到的另一个问题是,在绘制的线条上放大(缩放)后,QGraphicsView的滚动条跳到视图的左上角。

EN

回答 1

Stack Overflow用户

发布于 2019-04-09 15:22:55

默认情况下,QGraphicsItem根据视图转换进行调整。

您可以通过在MyGraphicsItem构造函数中添加setFlag(QGraphicsItem::ItemIgnoresTransformations);来忽略它。放大/缩小时,您的项目将不会缩放。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55546918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档