美文网首页
QTableWidget

QTableWidget

作者: downdemo | 来源:发表于2018-09-04 15:15 被阅读62次

QTableWidget
QTableWidgetItem

  • 标题居中
label->setAlignment(Qt::AlignCenter | Qt::AlignVCenter);
  • 新建
int row = 20;
int col = 10;
QTableWidget* table = new QTableWidget(row, col, this);
table->horizontalHeader()->setDisabled(true); // 设置列表头不能拖动
table->horizontalHeader()->setVisible(false); // 隐藏列表头

// 设置行表头
for (int i = 0; i < row; ++i)
{
    QTableWidgetItem* header = new QTableWidgetItem(v[i]); // 元素为QString的容器
    header->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); // 居中
    table->setVerticalHeaderItem(i, header); // 列表头则用setHorizontalHeaderItem
}

// 行表头字体加粗
QFont font = table1->horizontalHeader()->font();
font.setBold(true);
table->verticalHeader()->setFont(font);

// 设置表内容
for (int i = 0; i < row; ++i)
{
    QString txt = QString("%1").arg(row + 1);
    QTableWidgetItem* item = new QTableWidgetItem;
    item->setText(txt);

    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    item->setFlags(Qt::ItemFlags(32));
    // item->setBackgroundColor(QColor(0, 60, 10));
    item->setTextColor(QColor(200, 111, 100));
    item->setFont(QFont("Helvetica"));
    table->setItem(i, 0, item);
}

QVBoxLayout* layout = new QVBoxLayout(this);
layout->addWidget(m_pViewerTable);

QWidget *centralWidget = new QWidget();
centralWidget->setLayout(layout);
setCentralWidget(centralWidget);
  • 单元格以控件填充
QComboBox* combobox = new QComboBox;
combobox->addItem("test1");
combobox->addItem("test2");
table->setCellWidget(0, 0, combobox);
// 获取ComboBox文本
QComboBox* tmp = qobject_cast<QComboBox*>(table->cellWidget(0, 0));
qDebug() << tmp->currentText();
  • 样式
// 隐藏行列
setRowHidden(int row, bool hide);
setColumnHidden(int column, bool hide);

// 检查行列隐藏状态
bool isRowHidden(int row) const;
bool isColumnHidden(int column) const;

// 清空表格
table->clearContents(); // 清除所有非表头item
table->setRowCount(0);

// 最后一列自动扩展宽度
table1->horizontalHeader()->setStretchLastSection(true);

// 等宽
QHeaderView* headerView = ui->tableWidget->horizontalHeader();
headerView->setSectionResizeMode(QHeaderView::Stretch);
// 或者直接实现
table1->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

// 固定某列宽度
table->horizontalHeader()->setSectionResizeMode(5, QHeaderView::Fixed);

// 表头字体加粗
QFont font = table1->horizontalHeader()->font();
font.setBold(true);
table1->verticalHeader()->setFont(font);

table->setEditTriggers(QAbstractItemView::NoEditTriggers); // 设置为不可编辑方式

// 选中方式
table->setSelectionBehavior(QAbstractItemView::SelectItems); // 单个选中
table->setSelectionBehavior(QAbstractItemView::SelectRows); // 整行选中
table->setSelectionMode(QAbstractItemView::ExtendedSelection); // 可以选中多个

// 其他样式
table->horizontalHeader()->setVisible(false); // 隐藏列表头
table->verticalHeader()->setVisible(false); // 隐藏行表头
table->horizontalHeader()->setHighlightSections(false); // 取消选中单元格时表头高亮
table->horizontalHeader()->setFixedHeight(10); // 设置表头高度
table->verticalHeader()->setDefaultSectionSize(10); // 设置行高
table->setColumnWidth(int column, int width); // 设置列宽
table->horizontalHeader()->resizeSection(0, 100); // 设置第一列宽度为100
table->setFrameShape(QFrame::NoFrame); // 整个表格无外围黑线边框
table->setShowGrid(false); // 不显示表格格子线
table->setStyleSheet("selection-background-color:lightblue;"); // 设置选中背景色
table->horizontalHeader()->setStyleSheet("QHeaderView::section{background:skyblue;}"); // 设置表头背景色

// 隐藏滚动条
table->verticalScrollBar()->setEnabled(false);
table->horizontalScrollBar()->setEnabled(false);
// 滚动条样式
x->horizontalScrollBar()->setStyleSheet("QScrollBar{background:transparent; height:10px;}"
        "QScrollBar::handle{background:lightgray; border:2px solid transparent; border-radius:5px;}"
        "QScrollBar::handle:hover{background:gray;}"
        "QScrollBar::sub-line{background:transparent;}"
        "QScrollBar::add-line{background:transparent;}");
x->verticalScrollBar()->setStyleSheet("QScrollBar{background:transparent; width: 10px;}"
        "QScrollBar::handle{background:lightgray; border:2px solid transparent; border-radius:5px;}"
        "QScrollBar::handle:hover{background:gray;}"
        "QScrollBar::sub-line{background:transparent;}"
        "QScrollBar::add-line{background:transparent;}");

x->setFocusPolicy(Qt::NoFocus); // 取消选中时格子虚线,但无法再使用键盘控制表格
  • 取消选中时格子周围的虚线
// file “style.h”

#pragma once

#include "qstyleditemdelegate.h"
class NoFocusDelegate : public QStyledItemDelegate
{
private:
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        QStyleOptionViewItem itemOption(option);
        if (itemOption.state & QStyle::State_HasFocus)
        {
            itemOption.state = itemOption.state ^ QStyle::State_HasFocus;
        }
        QStyledItemDelegate::paint(painter, itemOption, index);
    }
};

// 包含头文件即可直接使用
#include "style.h"

table->setItemDelegate(new NoFocusDelegate());
  • QTableWidgetItem设置
QTableWidgetItem* item = new QTableWidgetItem("text"); // 单元格文字
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); // 居中
item->setText(const QString &text); // 设置文字
item->setBackgroundColor(QColor(0, 60, 10)); // 背景色
item->setTextColor(QColor(200, 111, 100)); // 字体色
item->setFont(QFont("Helvetica")); // 字体
table->setItem(0, 0, item); // 添加到表格(0, 0)位置
table->setEditTriggers(QAbstractItemView::CurrentChanged); // 单击单元格即进入编辑状态
item->setFlags(Qt::ItemFlags(32)); // 单元格设置为不可选
enum ItemFlags {
    NoItemFlags=0,
​    ItemIsSelectable=1,
​    ItemIsEditable=2,
​ ​   ItemIsDragEnabled=4,
​   ​ ItemIsDropEnabled=8,
​   ​ ItemIsUserCheckable=16,
​   ​ ItemIsEnabled=32,
​   ​ ItemIsTristate=64,
​   ​ ItemNeverHasChildren=128,
​   ​ ItemIsUserTristate=256
​};

0:浅色不可选中不可编辑
32:黑色可选中(不高亮)不可编辑
63:黑色双击可编辑,枚举中没有,是初始化时的默认值

// 单元格判空
if(table->item(0, 0)->text() == "") ... // 已设置item
if(table->item(0,0) == nullptr) ... // 未设置item

// 获取内容转为QString
QString str = table->item(0, 0)->data(Qt::DisplayRole).toString();

// 合并单元格
table->setSpan(0, 0, 3, 2); // 合并(0, 0)在内的右下方向的三行两列
  • 导出到Excel
// 只有行表头
void dlg::slot()
{
    QString path = QFileDialog::getSaveFileName(this, tr(u8"另存为"),
        "C:\\Users\\downdemo\\Desktop", tr(u8"Excel文件(*.xlsx);"));

    if (!path.isEmpty())
    {
        int row = table1->rowCount();
        int col = table1->columnCount();
        QList<QString> list;
        for (int i = 0; i < row; ++i)
        {
            QString rowStr = "";
            for (int j = 0; j < col; ++j)
            {
                rowStr.append(table1->verticalHeaderItem(i)->text() + "\t");
                if (table1->item(i, j) != nullptr) rowStr.append(table1->item(i, j)->text() + "\t");
                else rowStr.append("\t");
            }
            list.push_back(rowStr);
        }

        QTextEdit textEdit;
        for (int i = 0; i < list.size(); ++i)
        {
            textEdit.append(list.at(i));
        }

        QFile file(path);
        if (file.open(QFile::WriteOnly | QIODevice::Text))
        {
            QTextStream ts(&file);
            ts.setCodec("GB2312"); // 或"utf-8"
            ts << textEdit.document()->toPlainText();
            file.close();
        }
    }
}

// 只有列表头
void dlg::slot2()
{
    QString path = QFileDialog::getSaveFileName(this, tr(u8"另存为"),
        "C:\\Users\\downdemo\\Desktop", tr(u8"Excel文件(*.xlsx);"));

    if (!path.isEmpty())
    {
        int row = table2->rowCount();
        int col = table2->columnCount();

        QList<QString> list;
        QString HeaderRow;
        for (int i = 0; i < col; ++i)
        {
            HeaderRow.append(table2->horizontalHeaderItem(i)->text() + "\t");
        }
        list.push_back(HeaderRow);

        for (int i = 0; i < row; ++i)
        {
            QString rowStr = "";
            for (int j = 0; j < col; ++j)
            {
                if (table2->item(i, j) != nullptr) rowStr.append(table2->item(i, j)->text() + "\t");
                else rowStr.append("\t");
            }
            list.push_back(rowStr);
        }

        QTextEdit textEdit;
        for (int i = 0; i < list.size(); ++i)
        {
            textEdit.append(list.at(i));
        }

        QFile file(path);
        if (file.open(QFile::WriteOnly | QIODevice::Text))
        {
            QTextStream ts(&file);
            ts.setCodec("GB2312"); // 或"utf-8"
            ts << textEdit.document()->toPlainText();
            file.close();
        }
    }
}
  • 点击表格信号
// 点击横向表头(列表头)
connect(table->horizontalHeader(), &QHeaderView::sectionClicked, this, &dlg::clickHeader);
// 点击纵向表头(行表头)
connect(table->verticalHeader(), &QHeaderView::sectionClicked, this, &dlg::clickHeader);
// 点击表头的信号的参数为int
void dlg::clickHeader(int n)
{
    qDebug() << n;
}

// 点击单元格
connect(table, &QTableWidget::itemClicked, this, &dlg::slot);
// 点击单元格的信号的参数为QTableWidgetItem*
void dlg::slot(QTableWidgetItem* item)
{
    qDebug() << item->row() << item->column();
}

相关文章

网友评论

      本文标题:QTableWidget

      本文链接:https://www.haomeiwen.com/subject/plggwftx.html