2016-08-04 63 views
0

掌握文字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

我試過更新它 –

回答

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

如果你真的無法修改與畫家的代碼,你必須記住所有的矩形和文字對他們:

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

看到沒有其他辦法。不考慮用位圖識別文本:)