将QLabel与自定义QGraphicsItem对齐

时间:2018-04-12 02:34:20

标签: c++ qt qgraphicsitem qlabel

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

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

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

请帮忙

1 个答案:

答案 0 :(得分:1)

当您通过代理添加窗口小部件时,代理是初始项的子项,因此其位置将相对于它,默认情况下位置为(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();
}

enter image description here

假设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();
}