将 QLabel 与自定义 QGraphicsItem 对齐

Align QLabel with custom QGraphicsItem

我是 Qt 编程的新手,我想将 QLabel 与我创建的自定义 QGraphicsItem 对齐。这是我的自定义项目构造函数:

QGraphicsProxyWidget* pMyProxy = new QGraphicsProxyWidget(this);
QLabel *label = new QLabel();
label->setText("Some Text");
pMyProxy->setWidget(label);
label->setAlignment(Qt::AlignLeft);

最后一行无论是左对齐、居中还是右对齐似乎都没有影响。 myItem 是一个自定义矩形,我希望标签在矩形内居中,因为它是标签的第一个单词,它以矩形而不是标签的中心为中心。

请帮忙

当您通过代理添加小部件时,代理是初始项目的子项,因此其位置将相对于它,默认情况下位置为 (0, 0),因此您会看到,尽管您设置了对齐不会改变,您必须通过 setPos():

将其置于中心
#include <QApplication>
#include <QGraphicsProxyWidget>
#include <QGraphicsView>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsView w;
    QGraphicsScene *scene = new QGraphicsScene;

    QGraphicsRectItem *item = new QGraphicsRectItem;
    item->setRect(QRect(0, 0, 200, 200));
    item->setBrush(Qt::red);
    scene->addItem(item);
    QGraphicsProxyWidget *pMyProxy = new QGraphicsProxyWidget(item);
    QLabel *label = new QLabel();
    label->setText("Some Text");
    pMyProxy->setWidget(label);
    pMyProxy->setPos(item->boundingRect().center()-label->rect().center());
    w.setScene(scene);
    w.show();

    return a.exec();
}


假设 this 是项目,您应该执行以下操作:

QGraphicsProxyWidget *pMyProxy = new QGraphicsProxyWidget(this);
QLabel *label = new QLabel();
label->setText("Some Text");
pMyProxy->setWidget(label);
pMyProxy->setPos(boundingRect().center()-label->rect().center());

如果您想要访问关于该项目的小部件,您必须遵循子树:

QGraphiscScene
└── QGraphiscItem
    └── (children)
        QGraphicsProxyWidget
        └── (widget)
            QLabel

示例:

main.cpp

#include <QApplication>
#include <QGraphicsProxyWidget>
#include <QGraphicsView>
#include <QLabel>
#include <QTimer>
#include <QDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsView w;
    QGraphicsScene *scene = new QGraphicsScene;

    QGraphicsRectItem *item = new QGraphicsRectItem;
    item->setRect(QRect(0, 0, 200, 200));
    item->setBrush(Qt::red);
    scene->addItem(item);
    item->setFlag(QGraphicsItem::ItemIsSelectable, true);
    item->setFlag(QGraphicsItem::ItemIsMovable, true);
    QGraphicsProxyWidget *pMyProxy = new QGraphicsProxyWidget(item);
    QLabel *label = new QLabel();
    label->setText("Some Text");
    pMyProxy->setWidget(label);
    pMyProxy->setPos(item->boundingRect().center()-label->rect().center());
    w.setScene(scene);
    QTimer timer;
    QObject::connect(&timer, &QTimer::timeout, [&](){
        if(!scene->selectedItems().isEmpty()){
            auto *item = scene->selectedItems().first();
            if(!item->childItems().isEmpty()){
                auto proxy = static_cast<QGraphicsProxyWidget *>(item->childItems().first());
                if(proxy){
                    auto label = qobject_cast<QLabel *>(proxy->widget());
                    if(label){
                        label->setText(QString("x: %1, y: %2").arg(item->pos().x()).arg(item->pos().y()));
                    }
                }
            }
        }
    });
    timer.start(100);
    w.show();

    return a.exec();
}