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 查看所有可用属性
相关推荐
独立开阀者_FwtCoder6 分钟前
"页面白屏了?别慌!前端工程师必备的排查技巧和面试攻略"
java·前端·javascript
慧一居士7 分钟前
Vite 完整功能详解与 Vue 项目实战指南
前端·vue.js
南岸月明7 分钟前
不聊主业,聊聊你们眼中的副业是什么样的?
前端
Kevin在掘金9201412 分钟前
c#、.net、Fluent UI Blazor
前端
LovelyAqaurius13 分钟前
RSA加密算法:从数学魔法到现实守护
前端
Hilaku14 分钟前
说实话,React的开发体验,已经被Vue甩开几条街了
前端·javascript·vue.js
蛋黄蛋黄18 分钟前
微信表情怎么在自己的项目使用微信表情?-> [开源仓库]wechat-emoji
前端·github
汪子熙19 分钟前
错误剖析:net::ERR_HTTP2_PROTOCOL_ERROR 200 (OK) 的含义与解决之道
前端
猩猩程序员21 分钟前
Rust 1.88 稳定支持裸函数:更安全简洁的汇编函数写法
前端
艾克马斯奎普特22 分钟前
为什么响应性语法糖最终被废弃了?尤雨溪也曾经试图让你不用写 .value
前端·vue.js·代码规范