Qt的QTableWidget样式设置

在 Qt 中,可以通过样式表(QSS)为 QTableWidget 设置各种样式。以下是一些常见的样式设置示例:

1. 基本样式设置

cpp 复制代码
tableWidget->setStyleSheet(
    // 表格整体样式
    "QTableWidget {"
    "   background-color: #F0F0F0;"  // 背景色
    "   gridline-color: #C0C0C0;"     // 网格线颜色
    "   border: 1px solid gray;"     // 边框
    "}"
    
    // 表头样式
    "QHeaderView::section {"
    "   background-color: #404040;"  // 表头背景
    "   color: white;"               // 文字颜色
    "   padding: 4px;"               // 内边距
    "   border: 1px solid #505050;"  // 边框
    "   min-height: 25px;"           // 最小高度
    "}"
    
    // 单元格样式
    "QTableWidget::item {"
    "   color: #333333;"            // 文字颜色
    "   border-bottom: 1px solid #D0D0D0;"  // 底部边框
    "}"
    
    // 选中状态
    "QTableWidget::item:selected {"
    "   background-color: #B8D6FF;"  // 选中背景色
    "   color: black;"               // 选中文字颜色
    "}"
);

2. 高级样式设置

cpp 复制代码
// 交替行颜色(需要开启交替行颜色功能)
tableWidget->setAlternatingRowColors(true);
tableWidget->setStyleSheet(
    "QTableWidget { alternate-background-color: #F8F8F8; }"
);

// 角部按钮样式(表格左上角按钮)
tableWidget->setStyleSheet(
    "QTableCornerButton::section {"
    "   background-color: #404040;"
    "   border: 1px solid #505050;"
    "}"
);

// 禁用状态样式
tableWidget->setStyleSheet(
    "QTableWidget:disabled {"
    "   color: #808080;"
    "   background-color: #F0F0F0;"
    "}"
);

// 设置特定列宽/行高
tableWidget->horizontalHeader()->setDefaultSectionSize(150);  // 列宽
tableWidget->verticalHeader()->setDefaultSectionSize(30);     // 行高

3. 自定义单元格样式

cpp 复制代码
// 通过代理自定义样式(需要继承 QStyledItemDelegate)
class CustomDelegate : public QStyledItemDelegate {
public:
    void paint(QPainter* painter, const QStyleOptionViewItem& option, 
              const QModelIndex& index) const override {
        // 自定义绘制逻辑
        if(index.column() == 0) {
            painter->fillRect(option.rect, QColor("#FFE4E1"));
        }
        QStyledItemDelegate::paint(painter, option, index);
    }
};

// 设置代理
tableWidget->setItemDelegate(new CustomDelegate());

4. 动态样式设置

cpp 复制代码
// 修改特定行颜色
for(int row = 0; row < tableWidget->rowCount(); ++row) {
    QTableWidgetItem* item = tableWidget->item(row, 0);
    if(item) {
        item->setBackground(QColor("#E6F3FF"));
        item->setForeground(Qt::blue);
    }
}

// 设置特定单元格样式
QTableWidgetItem* specialItem = new QTableWidgetItem("Important");
specialItem->setData(Qt::UserRole, "special");
tableWidget->setItem(0, 0, specialItem);

// 在样式表中添加特殊样式
tableWidget->setStyleSheet(
    "QTableWidgetItem[special=\"true\"] {"
    "   background-color: #FFD700;"
    "   font-weight: bold;"
    "}"
);

5. 完整样式表示例

cpp 复制代码
tableWidget->setStyleSheet(R"(
    QTableWidget {
        background-color: #FFFFFF;
        alternate-background-color: #F8F8F8;
        gridline-color: #E0E0E0;
        border: 1px solid #D0D0D0;
        font-size: 12px;
    }

    QHeaderView::section {
        background-color: #0078D4;
        color: white;
        padding: 4px;
        border: none;
        min-height: 28px;
    }

    QHeaderView::section:hover {
        background-color: #006CBC;
    }

    QHeaderView::section:pressed {
        background-color: #005AA3;
    }

    QTableWidget::item {
        border-bottom: 1px solid #E0E0E0;
        padding: 4px;
    }

    QTableWidget::item:selected {
        background-color: #B8D6FF;
        color: #000000;
    }

    QTableCornerButton::section {
        background-color: #0078D4;
        border: none;
    }

    QScrollBar:vertical {
        width: 12px;
        background: #F0F0F0;
    }

    QScrollBar::handle:vertical {
        background: #C0C0C0;
        min-height: 20px;
    }
)");

注意事项:

  1. 样式表优先级高于代码设置的属性
  2. 使用 alternate-background-color 需要先调用 setAlternatingRowColors(true)
  3. 复杂的样式建议使用 QSS 文件管理
  4. 对于性能敏感的场景,避免频繁修改样式表
  5. 可以使用 Qt Style Sheet Reference 查看所有可用属性
相关推荐
技术钱几秒前
element plus 多个form校验
前端
yume_sibai10 分钟前
HTML HTML基础(3)
前端·html
米花丶17 分钟前
JSBridge安全通信:iOS/Android桥对象差异与最佳实践
前端·webview
萌萌哒草头将军1 小时前
🚀🚀🚀 Oxc 恶意扩展警告;Rolldown 放弃 CJS 支持;Vite 发布两个漏洞补丁版本;Rslib v0.13 支持 ts-go
前端·javascript·vue.js
接着奏乐接着舞。1 小时前
3D地球可视化教程 - 第1篇:基础地球渲染系统
前端·javascript·vue.js·3d·three.js
龙傲天6661 小时前
Scala的面向对象和函数式编程特性 Idea环境搭建和输入输出
前端
蓝色海岛1 小时前
element-ui表格嵌套表格,鼠标移入时样式错乱-问题调研及处理办法
前端
薄雾晚晴1 小时前
Rspack 实战:用 SWC Loader 搞定 JS 兼容(支持 IE 11 + 现代浏览器,兼顾构建速度)
前端·vue.js
恋猫de小郭1 小时前
Flutter 官方 LLM 动态 UI 库 flutter_genui 发布,让 App UI 自己生成 UI
android·前端·flutter
kymjs张涛2 小时前
零一开源|前沿技术周刊 #15
前端·javascript·面试