【问题标题】:Getting QRectF with text by click on QGraphicsItem通过单击 QGraphicsItem 获取带有文本的 QRectF
【发布时间】:2016-12-10 19:55:51
【问题描述】:

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

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?
}

更新: 方法paint用于继承自QGraphicsItem(CustomItem)的类中,并且此类item上有多个文本矩形。

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

【问题讨论】:

  • 画家用在哪里?在场景事件中还是在项目事件中?如果是第二个,这个项目是提供几个文本矩形还是一个?
  • 从哪里调用GetTextByCoordinates
  • 我已经尝试更新了

标签: c++ qt qgraphicsitem qpainter qrect


【解决方案1】:

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

操作在场景中绘制的逻辑对象的正常方法是将QGraphicsItems 放置在场景中。你的情况有QGraphicsRectItemQGraphicsSimpleTextItem。它看起来像这样:

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 "";
    }
};

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

【讨论】:

    猜你喜欢
    • 2016-04-22
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多