QGraphicsItem 類是 QGraphicsScene 中全部 item 的基類。框架
它提供了一個輕量級的基礎,用於編寫自定義 item。其中包括:定義 item 的幾何形狀、碰撞檢測、繪製實現、以及經過其事件處理程序進行 item 的交互,QGraphicsItem 是 Qt之圖形視圖框架 的一部分。函數
爲方便起見,Qt 爲最多見的形狀提供了一組典型的標準 item。它們是:字體
QGraphicsSimpleTextItem:提供了一個簡單的文本標籤項
QGraphicsTextItem:提供了一個格式化的文本項
QGraphicsLineItem:提供了一個直線項
QGraphicsPixmapItem:提供了一個圖像項
QGraphicsRectItem:提供了一個矩形項
QGraphicsEllipseItem:提供了一個橢圓項
QGraphicsPathItem:提供了一個路徑項
QGraphicsPolygonItem:提供了一個多邊形項spa
QGraphicsSimpleTextItem 提供了一個簡單的文本標籤項,能夠添加到 QGraphicsScene 中。3d
要設置 item 的文本,能夠傳遞 QString 到 QGraphicsSimpleTextItem 的構造函數,或在以後調用 setText() 來更改文本。要設置文本填充色,調用 setBrush()。code
QGraphicsSimpleTextItem 能夠具備填充和輪廓,setBrush() 用於設置文本填充(即文本色),setPen() 用於設置繪製文本輪廓的畫筆(後者可能很慢,特別是對於複雜的畫筆,以及具備長文本內容的 item)。orm
若是隻想繪製一行簡單的文本,只須要調用 setBrush(),不須要設置畫筆。QGraphicsSimpleTextItem 的畫筆默認是 Qt::NoPen。blog
QGraphicsSimpleTextItem 使用文本的格式化大小和相關聯的字體,爲 boundingRect()、shape() 和 contains() 提供了一個合理的實現。能夠經過調用 setFont() 設置字體。事件
QGraphicsSimpleText 不顯示富文本,相反,能夠使用 QGraphicsTextItem,它提供全文控制功能。ip
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 類提供了一個格式化的文本項,能夠添加到 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 類提供了一個直線項,能夠添加到 QGraphicsScene 中。
要設置 item 的直線,能夠傳遞 QLineF 到 QGraphicsLineItem 的構造函數,或調用 setLine() 函數。line() 返回當前直線。默認狀況下,該直線爲黑色,寬度爲 0,能夠經過調用 setPen() 進行更改。
QGraphicsLineItem 使用直線和畫筆的寬度,爲 boundingRect()、shape() 和 contains() 提供了一個合理的實現。paint() 函數使用 item 關聯的畫筆繪製直線。
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 類提供了一個矩形項,能夠添加到 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 類提供了一個橢圓項,能夠添加到 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 類提供了一個路徑項,能夠添加到 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 類提供了一個多邊形項,能夠添加到 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); }