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 查看所有可用属性
相关推荐
金花顺几秒前
android_media_AudioTrack
前端·面试
木公子1 分钟前
Vue3源码精读04:Scheduler 调度器深度解析|异步批量更新与任务队列源码全解
前端·vue.js
YHL2 分钟前
🧠 React useContext 深度解析:告别 Props 层层传递的噩梦
前端·react.js
萧行之12 分钟前
Observalble Plot和图形语法理论
前端·数据可视化
开开心心就好14 分钟前
手机悬屏翻译工具外语游戏漫画APP全覆盖
android·前端·javascript·python·游戏·pdf·html
西西弗Sisyphus17 分钟前
Qt 无边框窗口自己实现拖拽与缩放
开发语言·qt
支支დ20 分钟前
Phind 前端特定优势:AI 编程助手的体验革新
前端
狮子雨恋21 分钟前
anaconda python环境和QT python环境不一致如何解决
开发语言·python·qt
DDXYcoder26 分钟前
万字解析动态内存从编译到运行
java·前端·算法
光影少年27 分钟前
react navite封装一个RN 通用按钮组件
前端·javascript·react native·react.js·前端框架