翻譯|使用教程|編輯:龔雪|2022-06-16 10:32:58.197|閱讀 200 次
概述:本文繼續為大家介紹Qt Widget中的樣式和樣式感知小部件,歡迎大家下載相關組件體驗!
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
樣式(繼承的類)代表小部件繪制并封裝 GUI 的外觀。 QStyle 類是一個抽象基類,它封裝了 GUI 的外觀。 Qt 的內置小部件使用它來執行幾乎所有的繪圖,確保它們看起來與等效的原生小部件完全一樣。
Qt帶有一系列內置樣式,某些樣式僅在特定平臺上可用。自定義樣式可作為插件使用,或者通過使用 ()創建特定樣式類的實例并使用()設置它。
Qt技術交流群:166830288 歡迎一起進群討論
的子類包含設置各個元素樣式所需的所有信息,樣式選項被實例化 - 通常在堆棧上 - 并由函數的調用者填寫。根據繪制的內容,樣式將期望不同的樣式選項類。 例如,QStyle::PE_FrameFocusRect 元素需要一個 參數,并且可以創建自定義樣式可以使用的自定義子類。 出于性能原因,樣式選項保留公共變量。
小部件可以處于許多不同的狀態,這些狀態由枚舉定義。 一些狀態標志根據小部件具有不同的含義,但其他狀態標志對于所有小部件都是通用的,例如 State_Disabled。 使用(); 設置公共狀態的是; 其余狀態由各個小部件設置。
最值得注意的是,樣式選項包含要繪制的小部件調色板和邊界矩形,大多數小部件都有專門的樣式選項。 例如,和使用作為樣式選項,其中包含文本、圖標和圖標的大小。 當我們瀏覽各個小部件時,將描述所有選項的確切內容。
在重新實現帶有參數的函數時,您通常需要將 強制轉換為子類(例如,)。 為了安全起見,您可以使用()來確保指針類型正確。 如果對象的類型不正確,qstyleoption_cast() 返回 nullptr, 例如:
const QStyleOptionFocusRect *focusRectOption = qstyleoption_cast<const QStyleOptionFocusRect *>(option); if (focusRectOption) { ... }
以下代碼片段說明了如何使用 QStyle 從自定義小部件的 paintEvent() 中繪制焦點矩形:
void MyWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); ... QStyleOptionFocusRect option(1); option.init(this); option.backgroundColor = palette().color(QPalette::Window); style().drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter, this); }
下一個示例顯示如何從現有樣式派生以自定義圖形元素的外觀:
class CustomStyle : public QProxyStyle { Q_OBJECT public: CustomStyle(const QWidget *widget); ~CustomStyle() {} void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const override; }; void CustomStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { if (element == PE_IndicatorSpinUp || element == PE_IndicatorSpinDown) { QPolygon points(3); int x = option->rect.x(); int y = option->rect.y(); int w = option->rect.width() / 2; int h = option->rect.height() / 2; x += (option->rect.width() - w) / 2; y += (option->rect.height() - h) / 2; if (element == PE_IndicatorSpinUp) { points[0] = QPoint(x, y + h); points[1] = QPoint(x + w, y + h); points[2] = QPoint(x + w / 2, y); } else { // PE_SpinBoxDown points[0] = QPoint(x, y); points[1] = QPoint(x + w, y); points[2] = QPoint(x + w / 2, y + h); } if (option->state & State_Enabled) { painter->setPen(option->palette.mid().color()); painter->setBrush(option->palette.buttonText()); } else { painter->setPen(option->palette.buttonText().color()); painter->setBrush(option->palette.mid()); } painter->drawPolygon(points); } else { QProxyStyle::drawPrimitive(element, option, painter, widget); } }
Qt技術交流群:166830288 歡迎一起進群討論
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都網