QT學習筆記6:常見的 QGraphicsItem


簡述

QGraphicsItem 類是 QGraphicsScene 中所有 item 的基類。

它提供了一個輕量級的基礎,用於編寫自定義 item。其中包括:定義 item 的幾何形狀、碰撞檢測、繪制實現、以及通過其事件處理程序進行 item 的交互,QGraphicsItem 是 Qt之圖形視圖框架 的一部分。

常見的 QGraphicsItem

為方便起見,Qt 為最常見的形狀提供了一組典型的標准 item。它們是:

QGraphicsSimpleTextItem:提供了一個簡單的文本標簽項
QGraphicsTextItem:提供了一個格式化的文本項
QGraphicsLineItem:提供了一個直線項
QGraphicsPixmapItem:提供了一個圖像項
QGraphicsRectItem:提供了一個矩形項
QGraphicsEllipseItem:提供了一個橢圓項
QGraphicsPathItem:提供了一個路徑項
QGraphicsPolygonItem:提供了一個多邊形項

QGraphicsSimpleTextItem

詳細描述

QGraphicsSimpleTextItem 提供了一個簡單的文本標簽項,可以添加到 QGraphicsScene 中。

要設置 item 的文本,可以傳遞 QString 到 QGraphicsSimpleTextItem 的構造函數,或在之后調用 setText() 來更改文本。要設置文本填充色,調用 setBrush()。

QGraphicsSimpleTextItem 可以具有填充和輪廓,setBrush() 用於設置文本填充(即文本色),setPen() 用於設置繪制文本輪廓的畫筆(后者可能很慢,特別是對於復雜的畫筆,以及具有長文本內容的 item)。

如果只想繪制一行簡單的文本,只需要調用 setBrush(),不需要設置畫筆。QGraphicsSimpleTextItem 的畫筆默認是 Qt::NoPen。

QGraphicsSimpleTextItem 使用文本的格式化大小和相關聯的字體,為 boundingRect()、shape() 和 contains() 提供了一個合理的實現。可以通過調用 setFont() 設置字體。

QGraphicsSimpleText 不顯示富文本,相反,可以使用 QGraphicsTextItem,它提供全文控制功能。

示例

 

 代碼

void TOPIScanningGUI::My()
{
    QGraphicsSimpleTextItem *pItem = new QGraphicsSimpleTextItem();
    pItem->setText("這是一個QGraphicsSimpleTextItem");
    QFont font = pItem->font();
    font.setPixelSize(20);  // 像素大小
    font.setItalic(true);  // 斜體
    font.setUnderline(true);  // 下划線
    pItem->setFont(font);
    pItem->setBrush(QBrush(QColor(0, 160, 230)));
    scene1->addItem(pItem);
}

QGraphicsTextItem

詳細描述

QGraphicsTextItem 類提供了一個格式化的文本項,可以添加到 QGraphicsScene 中。

要設置 item 的文本,可以傳遞 QString 到 QGraphicsTextItem 的構造函數,或調用 setHtml()/setPlainText()。

QGraphicsTextItem 使用文本的格式化大小和相關聯的字體,為 boundingRect()、shape() 和 contains() 提供了一個合理的實現。可以通過調用 setFont() 設置字體。

可以通過使用 setTextInteractionFlags() 設置 Qt::TextEditorInteraction 標志來使 item 可編輯。

item 的首選文本寬度可以使用 setTextWidth() 設置,並使用 textWidth() 獲取。

注意:為了在中心對齊 HTML 文本,必須設置 item 的文本寬度。否則,可以在設置 item 的文本后調用 adjustSize()。

 

注意: QGraphicsTextItem 默認接受 hover 事件,可以使用 setAcceptHoverEvents() 更改此值。

純文本

 代碼

void TOPIScanningGUI::My()
{
    QGraphicsTextItem *pItem = new QGraphicsTextItem();
    pItem->setPlainText("這是一個QGraphicsTextItem");  // 純文本
    pItem->setDefaultTextColor(QColor(0, 160, 230));  // 文本色
    QFont font = pItem->font();
    font.setPixelSize(20);  // 像素大小
    font.setItalic(true);  // 斜體
    font.setUnderline(true);  // 下划線
    pItem->setFont(font);
    scene1->addItem(pItem);
}

QGraphicsLineItem

詳細描述

QGraphicsLineItem 類提供了一個直線項,可以添加到 QGraphicsScene 中。

要設置 item 的直線,可以傳遞 QLineF 到 QGraphicsLineItem 的構造函數,或調用 setLine() 函數。line() 返回當前直線。默認情況下,該直線為黑色,寬度為 0,可以通過調用 setPen() 進行更改。

 

QGraphicsLineItem 使用直線和畫筆的寬度,為 boundingRect()、shape() 和 contains() 提供了一個合理的實現。paint() 函數使用 item 關聯的畫筆繪制直線。

 

 

QGraphicsPixmapItem

詳細描述

QGraphicsPixmapItem 類提供了一個圖像項,可以添加到 QGraphicsScene 中。

要設置 item 的圖像,可以傳遞 QPixmap 到 QGraphicsPixmapItem 的構造函數,或調用 setPixmap() 函數,pixmap() 返回當前的圖像。

QGraphicsPixmapItem 使用 pixmap 的可選 alpha 掩碼,為 boundingRect()、shape() 和 contains() 提供了一個合理的實現。

圖像在 item 的 (0, 0) 坐標處繪制,由 offset() 返回。可以通過調用 setOffset() 更改繪圖偏移量。

可以通過調用 setTransformationMode() 設置圖像的變換模式,默認情況下,使用 Qt::FastTransformation,它提供了快速、不平滑的縮放。Qt::SmoothTransformation 在 painter 上啟用 QPainter::SmoothPixmapTransform,質量取決於平台和視口。結果通常不如調用 QPixmap::scale() 直接,調用 transformMode() 獲取項目的當前轉換模式。

示例

代碼

void TOPIScanningGUI::My()
{
    // 定義一個 item
    QGraphicsPixmapItem *pItem = new QGraphicsPixmapItem();

    QPixmap image("D://logo.png");
    pItem->setPixmap(image.scaled(150, 150));

    scene1->addItem(pItem);
}

 

QGraphicsRectItem

詳細說明

QGraphicsRectItem 類提供了一個矩形項,可以添加到 QGraphicsScene 中。

要設置 item 的矩形,可以傳遞一個 QRectF 到 QGraphicsRectItem 的構造函數,或調用 setRect() 函數。rect() 返回當前矩形。

QGraphicsRectItem 使用矩形和畫筆寬度,為 boundingRect()、shape() 和 contains() 提供了一個合理的實現。paint() 函數使用 item 關聯的畫筆和畫刷繪制矩形,可以通過調用 setPen() 和 setBrush() 函數來設置。

注意:無效矩形(例如,寬度或高度為負)的呈現是未定義的。如果不能確定使用的是有效的矩形(例如,如果使用來自不可靠源的數據創建的矩形),那么應該使用 QRectF::normalized() 創建標准化的矩形,然后使用它們。

示例

代碼

void TOPIScanningGUI::My()
{
    // 定義一個 item
    QGraphicsRectItem  *pItem = new QGraphicsRectItem();

    // 設置畫筆、畫刷
    QPen pen = pItem->pen();
    pen.setWidth(5);
    pen.setColor(Qt::white);
    pItem->setPen(pen);
    pItem->setBrush(QBrush(QColor(0, 160, 230)));

    // 矩形區域 起點:(50, 50) 寬:100 高:100
    pItem->setRect(QRectF(50, 50, 100, 100));

    scene1->addItem(pItem);
}

QGraphicsEllipseItem

詳細說明

QGraphicsEllipseItem 類提供了一個橢圓項,可以添加到 QGraphicsScene 中。

QGraphicsEllipseItem 表示一個帶有填充和輪廓的橢圓,也可以使用它的橢圓段(見 startAngle()、spanAngle())。

要設置 item 的橢圓,可以傳遞一個 QRectF 到 QGraphicsEllipseItem 的構造函數,或調用 setRect()。rect() 返回當前橢圓的幾何形狀。

QGraphicsEllipseItem 使用 rect 和畫筆寬度,為 boundingRect()、shape() 和 contains() 提供了一個合理的實現。paint() 函數使用 item 關聯的畫筆和畫刷來繪制橢圓,可以通過調用 setPen() 和 setBrush() 來設置。

示例

代碼

void TOPIScanningGUI::My()
{
    // 定義一個 item
    QGraphicsEllipseItem *pItem = new QGraphicsEllipseItem();

    // 設置畫筆、畫刷
    QPen pen = pItem->pen();
    pen.setWidth(5);
    pen.setColor(Qt::white);
    pItem->setPen(pen);
    pItem->setBrush(QBrush(QColor(0, 160, 230)));

    // 矩形區域 起點:(50, 50) 寬:200 高:100
    pItem->setRect(QRectF(50, 50, 200, 100));
    pItem->setStartAngle(16 * 90);  // 起始角度
    pItem->setSpanAngle(16 * 270);  // 跨角

    scene1->addItem(pItem);
}

 

QGraphicsPathItem

詳細描述

QGraphicsPathItem 類提供了一個路徑項,可以添加到 QGraphicsScene 中。

要設置 item 的路徑,可以傳遞 QPainterPath 到 QGraphicsPathItem 的構造函數,或調用 setPath() 函數,path() 返回當前路徑。

 

QGraphicsPathItem 使用路徑,為 boundingRect()、shape() 和 contains() 提供了一個合理的實現。paint() 函數使用 item 關聯的畫筆和畫刷來繪制路徑,可以通過調用 setPen() 和 setBrush() 函數來設置。

示例


代碼

void TOPIScanningGUI::My()
{
    const float Pi = 3.14159f;

    // 定義一個 item
    QGraphicsPathItem *pItem = new QGraphicsPathItem();

    // 繪制星星
    QPainterPath starPath;
    starPath.moveTo(90, 50);
    for (int i = 1; i < 5; ++i) {
        starPath.lineTo(50 + 40 * std::cos(0.8 * i * Pi), 50 + 40 * std::sin(0.8 * i * Pi));
    }
    starPath.closeSubpath();
    pItem->setPath(starPath);

    // 設置畫筆、畫刷
    QPen pen = pItem->pen();
    pen.setWidth(2);
    pen.setColor(Qt::white);
    pItem->setPen(pen);
    pItem->setBrush(QBrush(QColor(0, 160, 230)));

    scene1->addItem(pItem);
}

 

QGraphicsPolygonItem

詳細描述

QGraphicsPolygonItem 類提供了一個多邊形項,可以添加到 QGraphicsScene 中。

要設置 item 的多邊形,傳遞 QPolygonF 到 QGraphicsPolygonItem 的構造函數,或調用 setPolygon() 函數。polygon() 返回當前的多邊形。

 

QGraphicsPolygonItem 使用多邊形和畫筆寬度,為 boundingRect()、shape() 和 contains() 提供了一個合理的實現。paint() 函數使用 item 關聯的畫筆和畫刷繪制多邊形,可以通過調用 setPen() 和 setBrush() 函數進行設置。

 

示例

 

代碼:

void TOPIScanningGUI::My()
{
    // 定義一個 item
    QGraphicsPolygonItem *pItem = new QGraphicsPolygonItem();

    // 繪制多邊形
    QPolygonF polygon;
    polygon << QPointF(200.0, 120.0) << QPointF(230.0, 130.0)
        << QPointF(260.0, 180.0) << QPointF(200.0, 200.0);
    pItem->setPolygon(polygon);

    // 設置畫筆、畫刷
    QPen pen = pItem->pen();
    pen.setWidth(2);
    pen.setColor(Qt::black);
    pItem->setPen(pen);
    pItem->setBrush(QBrush(QColor(0, 160, 230)));


    scene1->addItem(pItem);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM