繁体   English   中英

将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);

最后一行似乎对它的AlignLeft,Center或Right均无效。 myItem是一个自定义矩形,我希望标签在矩形内部居中,因为它是label的第一个单词是在矩形而不是标签的中心居中。

请帮忙

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM