Если у меня есть художник, прямоугольник и строка:
QPainter* pPainter;
//Initializing it
QRectF RectF;
//Initializing it
std::string strText = "Some string";
И я рисую прямоугольник с текстом, используя painter на каком-то объекте QGraphicsItem, а затем мы рисуем его на сцене:
pPainter->drawText(RectF, Qt::AlignCenter, strText);
Примечание: я не могу изменить код выше, только добавить что-то.
Моя цель — получить этот текст после нажатия на прямоугольник.
Предположим, что я нашел правильные координаты мыши.
Есть ли способ получить прямоугольник и его текст, используя координаты клика? Или, может быть, я должен держать какой-то список таких прямоугольников, чтобы обработать их дальше?
Я думал об использовании метода itemAt (), но я не мог получить прямоугольник таким образом.
std::string GetTextByCoordinates(int x, int y)
{
//What to do here?
}
Обновить:
Метод paint используется в классе, унаследованном от QGraphicsItem (CustomItem), и на таких элементах есть несколько текстовых прямоугольников.
Метод «GetTextByCoordinates» должен вызываться из этого объекта CustomItem.
Поскольку вы рисуете что-то на виджете, вы можете работать только с нарисованными пикселями. У вас нет информации об этом происхождении пикселей. Так что вам нужна дополнительная информация.
Обычный способ манипулировать логическими объектами, нарисованными на сцене, это разместить 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 "";
}
};
Если вы действительно не можете изменить код с помощью 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 "";
}
};
Не вижу других путей. Распознавание текста по растровому изображению не учитывается:)
Других решений пока нет …