由于您在小部件上绘制了一些东西,因此您只能对绘制的像素进行操作。您没有关于此像素来源的信息。所以你需要一些额外的信息。
操作场景中绘制的逻辑对象的常规方法是将QGraphicsItem
s 放置在场景中。有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 "";
}
};
如果你真的不能用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 "";
}
};
看不到其他方法。不考虑通过位图识别文本:)