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 查看所有可用属性
相关推荐
卸任13 小时前
Vibe coding工具使用心得
前端·ai编程
brien913 小时前
为什么模型标称 1M,Google Antigravity 聊到 256K 却突然失忆?我们给它做了个原生行内监控圆环
前端
修炼的dance14 小时前
录屏关键帧间隔多少合适?六档实测,2秒到10秒小了75.6%
前端
Lank_M14 小时前
关键帧从1秒拉到10秒,录屏小87.3%,摄像头小10.8%
前端
补码缩写14 小时前
用 ffprobe 拆录屏,八成字节在 29 个关键帧上
前端
百思不得小李14 小时前
一个复杂的动态表单是如何实现的
前端·设计模式
陈随易14 小时前
Cmder 停更 17 个月,2.0 支持 Windows Terminal
前端·后端·程序员
风骏时光牛马14 小时前
前沿视界
前端
kyriewen14 小时前
我扫了 814 个依赖,97 个还敢要 Node 10
前端·javascript·程序员
陈随易14 小时前
3000 万人在用的翻译插件,重写一遍就是一门生意
前端·后端·程序员