如果我有一些画家,一些矩形和一些字符串:
QPainter* pPainter;
//Initializing it
QRectF RectF;
//Initializing it
std::string strText = "Some string";
我在一些QGraphicsItem对象上使用painter绘制带有文本的矩形,然后我们在场景中绘制它:
pPainter->drawText(RectF, Qt::AlignCenter, strText);
注意:我无法修改上面的代码,只能添加一些内容。
我的目标是在点击矩形后获取该文本。 假设我已经正确找到了鼠标点击坐标。
有没有办法使用click的坐标获取矩形及其文本?或者也许我应该保留一些这样的矩形列表来处理它们? 我已经考虑过使用itemAt()方法,但是我无法通过这种方式获得矩形。
std::string GetTextByCoordinates(int x, int y)
{
//What to do here?
}
更新 方法paint在继承自QGraphicsItem(CustomItem)的类中使用,并且在这些项上有几个文本矩形。
应该从该CustomItem对象调用方法“GetTextByCoordinates”。
答案 0 :(得分:1)
由于您在窗口小部件上绘制了某些内容,因此只能使用绘制的像素进行操作。您没有关于此像素来源的信息。所以你需要一些额外的信息。
操纵场景上绘制的逻辑对象的常规方法是将ManipulationDelta
放在场景上。您的案例有QGraphicsItem
QGraphicsRectItem
。它看起来像这样:
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 "";
}
};
没有其他方法。不考虑位图识别的文本:)