上的QGraphicsItem

问题描述:

掌握文字QRectF通过点击如果我有一些画家,一些矩形和一些字符串:上的QGraphicsItem

QPainter* pPainter; 
//Initializing it 

QRectF RectF; 
//Initializing it 

std::string strText = "Some string"; 

而且我使用了一些的QGraphicsItem对象画家绘制矩形文本,然后我们绘制它的场景:

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

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

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

有没有什么办法用点击坐标来获得矩形及其文本?或者,也许我应该拿着这样的矩形列表来处理它们呢? 我想过使用itemAt()方法,但我无法获得矩形。

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

更新: 方法油漆以从的QGraphicsItem(定制项目)继承类使用,并且对这些项目的几个文本的矩形。

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

+0

画家在哪里使用?在场景事件或项目事件中?如果第二个,这个项目是否提供几个文本矩形或一个? – ilotXXI

+0

而GetTextByCoordinates是从哪里调用的? – ilotXXI

+0

我试过更新它 –

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

操纵场景中绘制的逻辑对象的正常方法是将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 ""; 
    } 
}; 

如果你真的无法修改与画家的代码,你必须记住所有的矩形和文字对他们:

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

看到没有其他办法。不考虑用位图识别文本:)