c++ - Qt - 使用绝对位置将项目添加到 QGraphicsScene

标签 c++ qt

这可能是一个转储问题,但我现在真的很困惑。我正在尝试在 QGraphicsScene 中绘制一些正方形,并且希望它们从位置 x = 0 向 x 坐标的正位置对齐。然而,它们是根据 QGraphicsView 的对齐配置进行对齐的,并且位置的设置仅对第二项有效,并且相对于第一项向上!这意味着如果我有一个项目,那么它的位置设置不起作用。主要是这条线似乎不起作用:

graphicsView->setAlignment(Qt::AlignAbsolute);

这是我的代码:

QGraphicsScene *scene = new QGraphicsScene();
QGraphicsView *graphicsView;
graphicsView->setScene(scene);
graphicsView->setAlignment(Qt::AlignAbsolute);

for(int i = 0; i < 500; i+= 50)
{
    QGraphicsPolygonItem *item = new QGraphicsPolygonItem();

    item->setPen(QPen(QColor(qrand()%255,qrand()%255,qrand()%255)));
    item->setBrush(QBrush(QColor(255,251,253)));
    item->setPolygon(*myPolygon);
    graphicsView->scene()->addItem(item);
    item->setPos(i , 40);
    item->setFlag(QGraphicsItem::ItemIsMovable, true);
    item->setFlag(QGraphicsItem::ItemIsSelectable, true);
    graphicsView->show();
}

我不知道问题出在哪里,所以我尝试了以下代码

const QRectF rect = QRectF(0, 0, ui->graphicsView->width(), ui->graphicsView->height());
ui->graphicsView->setScene(&_scene);
ui->graphicsView->fitInView(rect, Qt::KeepAspectRatio);
ui->graphicsView->setSceneRect(rect);

相对于前四行,以下输出不会产生彼此接近的尺寸:

qDebug() << "scene =>" << _scene.width() << _scene.height();
qDebug() << "graphicview =>" << ui->graphicsView->width() << ui->graphicsView->height();

非常感谢您的帮助。

最佳答案

看来Qt::AlignAbsolute不做你假设的事情。你真正需要的是Qt::AlignLeft | Qt::AlignTop .

这里解释一下: http://qt-project.org/doc/qt-4.8/qgraphicsview.html#alignment-prop http://qt-project.org/doc/qt-4.8/qt.html#AlignmentFlag-enum

在我的代码中,我只使用 graphicsView->setSceneRect(rect);而不是fitInView() 。后者引入了缩放,可能会妨碍您理解出了什么问题。

基本上,我覆盖了 QGraphicsview 来重新实现 resizeEvent() :

void AutohideView::resizeEvent(QResizeEvent *event)
{
    /* always resize the scene accordingly */
    if (scene())
        scene()->setSceneRect(QRect(QPoint(0, 0), event->size()));

    QGraphicsView::resizeEvent(event);
}

我不改变对齐方式或任何其他选项,并使用 [0 范围内的绝对坐标。 , 0 ..scene()->width() , scene()->height() ] 放置我的元素时。

关于c++ - Qt - 使用绝对位置将项目添加到 QGraphicsScene,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24460084/

相关文章:

c++ - 循环 std::unordered_map,序列总是我插入元素的序列?

c++ - Serial Hexa 对话框(C++/Qt 5.0 的 python 代码)

c++ - 将一个对象添加到另一个对象 C++

c++ - Qt 5 (Qt Quick) MenuItem 大部分时间显示为空白

qt - 有没有办法使用 Qt Designer 定义带有按钮和弹出菜单的 QToolbar?

c++ - 使用 QDateTimeAxis 时 QChart 不显示任何系列数据

qt - 是否可以在QML中获取mouseX,mouseY下的任何子组件

C++ MySQL 链接器错误

c++ - 全局友元函数的前向声明

c++ - 理解 qthreads - 在线程之间共享数据