gpt4 book ai didi

c++ - 通过单击 QGraphicsItem 获取带有文本的 QRectF

转载 作者:行者123 更新时间:2023-11-28 05:33:54 25 4
gpt4 key购买 nike

如果我有一些画家,一些矩形和一些字符串:

QPainter* pPainter;
//Initializing it

QRectF RectF;
//Initializing it

std::string strText = "Some string";

然后我在一些 QGraphicsItem 对象上使用 painter 绘制带有文本的矩形,然后我们在场景中绘制它:

pPainter->drawText(RectF, Qt::AlignCenter, strText);

注意:我不能修改上面的代码,只能添加一些东西。

我的目标是在单击矩形后获取该文本。假设我已经正确找到了鼠标点击坐标。

有什么方法可以使用点击坐标获取矩形及其文本吗?或者我应该保存一些这样的矩形列表以便接下来处理它们?我考虑过使用 itemAt() 方法,但我不能那样得到矩形。

std::string GetTextByCoordinates(int x, int y)
{
//What to do here?
}

更新:在继承自QGraphicsItem(CustomItem)的类中使用了方法paint,在这些项目上有几个文本矩形。

应该从该 CustomItem 对象调用方法“GetTextByCoordinates”。

最佳答案

由于您在小部件上绘制内容,因此您只能使用绘制的像素进行操作。您没有关于此像素来源的信息。所以您需要一些额外的信息。

操作在场景上绘制的逻辑对象的正常方法是在场景上放置QGraphicsItemQGraphicsRectItem QGraphicsSimpleTextItem 适合您的情况。它看起来像这样:

class CustomItem : public QGraphicsItem
{
public:
<...> // Methods like boundingRect and others also must be reimplemented.

void addText(const QString &text, const QRectF &containerRect)
{
// As this items are "this" children, you even don't need to
// reimplement paintEvent.
QGraphicsRectItem *rectItem =
new QGraphicsRectItem(containerRect, this);
QGraphicsSimpleTextItem *textItem =
new QGraphicsSimpleTextItem(text, rectItem);
}

QString getTextByCoordinates(int x, int y)
{
for (const auto *child: childItems()) {
const QGraphicsRectItem *rect =
qgraphicsobject_cast<const QGraphicsRectItem *>(child);
if (rect == nullptr)
continue;

const QGraphicsItem *text = rect->childItems().first();
return qgraphicsitem_cast<const QGraphicsSimpleTextItem *>(text)->text();
}

return "";
}
};

如果你真的不会用painter修改代码,你必须记住所有的矩形和上面的文字:

class CustomItem : public QGraphicsItem
{
private:
struct RectText
{
QRectF rect;
std::string text;
};

QList<RectText> _rectTexts;

public:
<...>

void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget = nullptr);
{
<...>

_rectTexts << {RectF, strText};
}

std::string GetTextByCoordinates(int x, int y)
{
for (const auto &rt: _rectTexts) {
if (rt.rect.contains(x, y))
return rt.text;
}

return "";
}
};

别无他法。不考虑位图识别的文本:)

关于c++ - 通过单击 QGraphicsItem 获取带有文本的 QRectF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38771636/

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