gpt4 book ai didi

c++ - 将 QLabel 与自定义 QGraphicsItem 对齐

转载 作者:行者123 更新时间:2023-11-28 04:43:14 25 4
gpt4 key购买 nike

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

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

关于c++ - 将 QLabel 与自定义 QGraphicsItem 对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49787087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com