c++ - 布局时 QGraphicsItem::pos 返回 0

标签 c++ qt qt5 qgraphicsitem qlayout

我的 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);
    }
};

我还给出了位于 ma​​in.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将改变其位置,这将在同步任务完成并且事件循环开始工作后的瞬间发生,这可以使用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)

关于c++ - 布局时 QGraphicsItem::pos 返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55421191/

相关文章:

c++ - 如何在MFC中的CArray中使用CArray?

c++ - 每次访问这个小部件时,如何在QWidget中保留QSpinBox上的设置值?

c++ - QProcess 无法传递参数

Qt-Creator:如何设置可以在 QTDesigner 中看到的应用程序范围样式表?

c++ - 如何处理成员函数中的递归?

c# - 从大小为 n 的 r 个元素生成幂多重集

qt - QApplication段错误

c++ - 嵌套的 QVector 指针内存处理

qt - 为什么自定义 QWidgets 而不是内置的 QWidgets 具有非零边距?

C++ 未定义对 `Vector_container::Vector_container(std::initializer_list<double>)' 的引用