QGraphicsItem :: pos在布局中返回0

米妮

我的widget.cpp中有以下Qt代码片段

Widget::Widget(QWidget *parent)
: QWidget(parent)
{
    m_Scene = new QGraphicsScene(this);
    m_Scene->setSceneRect(0, 0, 1024, 768);

    GraphicsTextItem* m_1 = new GraphicsTextItem(nullptr, QString("l_1"));

    GraphicsTextItem* m_2 = new GraphicsTextItem(nullptr, QString("l_2"));


    QGraphicsLinearLayout* layout = new QGraphicsLinearLayout;
    layout->addItem(m_1);
    layout->addItem(m_2);

    QGraphicsWidget* list = new QGraphicsWidget;
    list->setLayout(layout);
    m_Scene->addItem(list);

    qDebug() << m_2->x() << " " << m_2->y(); // Prints 0,0 Why?

    QGraphicsView* view = new QGraphicsView(this);
    view->setScene(m_Scene);
}

GraphicsTextItem是QGraphicsWidget的派生类:

class GraphicsTextItem : public QGraphicsWidget
{
private:
    QString m_Name;
public:
    GraphicsTextItem(QGraphicsItem * parent = nullptr, const QString& name = QString());
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
    {
        QFont font("Times", 12);
        painter->setFont(font);
        painter->drawText(0, 0, m_Name);
    }
};

我也将我的简短main放在main.cpp中

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

    return a.exec();
}

我的问题是,为什么qDebug行会向我打印0,0,因为小部件的位置肯定为非零。如果我不将小部件放在布局中,而是调用setPos(),则qDebug将打印以前设置的正确值。

永乐

所有QGraphicsItem的初始位置为(0,0),其中包括m_2,并且应用QGraphicsLinearLayout时m_2将更改其位置,该位置将在同步任务完成并且eventloop开始工作之后的瞬间。QTimer::singleShot(0, ...)

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{

    m_Scene = new QGraphicsScene(this);
    QGraphicsView* view = new QGraphicsView(this);
    view->setScene(m_Scene);

    m_Scene->setSceneRect(0, 0, 1024, 768);

    GraphicsTextItem *m_1 = new GraphicsTextItem(nullptr, QString("l_1"));

    GraphicsTextItem *m_2 = new GraphicsTextItem(nullptr, QString("l_2"));


    QGraphicsLinearLayout* layout = new QGraphicsLinearLayout;
    layout->addItem(m_1);
    layout->addItem(m_2);

    QGraphicsWidget* list = new QGraphicsWidget;
    list->setLayout(layout);
    m_Scene->addItem(list);

    qDebug() << "synchronous" << m_2->pos() << m_2->mapToScene(QPointF{});

    QTimer::singleShot(0, m_2, [m_2](){
        qDebug() << "asynchronous"<< m_2->pos() << m_2->mapToScene(QPointF{});
    });
}

输出:

synchronous QPointF(0,0) QPointF(0,0)
asynchronous QPointF(62,6) QPointF(62,6)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何获取QGraphicsItem中带有孔的形状的鼠标悬停事件?

如何正确删除QGraphicsItem?

防止QGraphicsItem中的字体缩放

如何在QGraphicsItem中包装文字?

QGraphicsItem中的ItemCoordinateCache和DeviceCoordinateCache有什么区别?

更改QGraphicsItem的颜色

QGraphicsItem边框样式

如何获取QGraphicsItem坐标系中的光标单击位置?

在Qt QGraphicsItem中实现OpenGL推荐

在QGraphicsScene中连续移动QGraphicsItem并检查Collision

为什么不能从QVector <QGraphicsItem>将项目添加到QGraphicsScene中?

如何在pyqt5中复制粘贴Qgraphicsitem?

QGraphicsItem不显示QGraphicsScene

如何在Pyqt5中删除QGraphicsItem

QGraphicsItem中的itemChanged()用于许多不同的项目

从QGraphicsItem获取QGraphicsView的大小

在QGraphicsItem上安装SceneEventFilter

Qt:鼠标移动过程中更改QGraphicsItem接收器

拖曳的QGraphicsItem在items()函数中不可见

Qt从QGraphicsItem调用类

在场景中添加新的QGraphicsItem时C ++程序崩溃

是否可以在paint()方法中绘制QGraphicsItem?

如何将在 QGraphicsItem 中绘制的像素图添加到 QGraphicsScene?

如何找到更接近鼠标 x 或鼠标 y 坐标的 QGraphicsItem(在 QList 中)?

将 QGraphicsItem::pos() 转换为场景坐标

PySide2 中的 QGraphicsItem.itemClipsChildrenToShape 问题

如何在 QGraphicsItem 中插入指针,以便在获得选定指针时访问它们?

如何从 QGraphicsView 上下文菜单中启动 QGraphicsItem 中的上下文菜单事件 - PyQt6

如何使用 QGraphicsItem 仅在圆形中绘制网格线