| 方法 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| QPalette | 標準 Widget、需動態切換主題 | 原生支援、效能佳、不影響子元件 | API 較繁瑣 |
| Style Sheet (QSS) | 快速原型、複雜視覺效果 | 語法直觀、CSS 風格、支援選擇器 | 視窗類別易影響子元件繼承、效能稍低 |
| paintEvent 繪圖 | 高度客製化、漸層/圖片背景 | 完全控制、可繪製任意圖形 | 需手動處理重繪、程式碼量大 |
QWidget *widget = new QWidget(this);
widget->setGeometry(0, 0, 300, 100);
QPalette pal = widget->palette();
pal.setColor(QPalette::Background, Qt::black); // 或 QColor("#RRGGBB")
widget->setAutoFillBackground(true); // 關鍵:啟用背景填充
widget->setPalette(pal);
widget->show();
QWidget *widget = new QWidget(this);
widget->setGeometry(0, 0, 300, 100);
widget->setStyleSheet("background-color: black;"); // 或 #000, rgb(0,0,0)
widget->show();
重要警示:頂層視窗使用 QSS 設定背景後,所有子元件會繼承此樣式,導致按鈕、標籤等也變黑。解決辦法:子元件同樣使用 QSS 明確設定背景,或改用 QPalette。
繼承 QWidget 的自訂類別必須實作 paintEvent 才能讓 QSS 生效:
void CustomWidget::paintEvent(QPaintEvent *event) {
Q_UNUSED(event);
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
void Widget::paintEvent(QPaintEvent *event) {
Q_UNUSED(event);
QPainter painter(this);
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::black); // 或 QBrush(QColor(...))
painter.drawRect(rect()); // 填滿整個 widget 區域
}
QPalette + setAutoFillBackground(true)QSS 更靈活 (background-color, border-radius, gradient)paintEvent 配合 QPainterQPalette 色彩角色,配合 QApplication::setPalette()