Qt之TableView使用

都博裕
2023-12-01

TableView使用中常用的方法

  • 表格宽度

ResizeMode:

QHeaderView::Interactive:0用户可设置,也可被程序设置成默认大小

QHeaderView::Fixed        :2用户不可更改列宽

QHeaderView::Stretch      :1根据空间,自动改变列宽,用户与程序不能改变列宽

QHeaderView::ResizeToContents:3根据内容改变列宽,用户与程序不能改变列宽

ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
//固定某列为特定值
ui->tableView->horizontalHeader()->setSectionResizeMode(0,QHeaderView::Fixed);
ui->tableView->setColumnWidth(0,30);
  • 行背景色交替改变,隔行颜色变化
ui->tableView->setAlternatingRowColors(true);
  • 表头,标准表头和自定义表头(增加全选复选框等)
//标准表头
QStandardItemModel* model = new QStandardItemModel();
QStringList labels;
labels <<"姓名" << "年级" << "班级" << "状态"<<"备注";
model->setHorizontalHeaderLabels(labels);
ui->tableView->setModel(model);

//自定义表头,
CheckBoxHeader *header = new CheckBoxHeader(Qt::Horizontal,(QWidget*)ui->tableView);
connect(header, &CheckBoxHeader::checkBoxClicked, this, &OCR::onCheckBoxClicked);

ui->tableView->setHorizontalHeader(header);
  • QStandardItemModel 标准数据模型
QStandardItemModel *model = new QStandardItemModel(this);

QStringList labels;
labels <<""<<"项目名称" <<"单价"<<"金额"<<"数量"<<"备注";
model->setHorizontalHeaderLabels(labels);

//定义item
QStandardItem *item = 0;
for(int i = 0;i < allItem.size();i++)
{
    item = new QStandardItem(allItem[i].name1);
    model->setItem(i,1,item);
    item = new QStandardItem(allItem[i].dj1);
    model->setItem(i,2,item);
    item = new QStandardItem(allItem[i].num1);
    model->setItem(i,3,item);
    item = new QStandardItem(allItem[i].price1);
    model->setItem(i,4,item);
}
CheckBoxHeader *header = new CheckBoxHeader(Qt::Horizontal,(QWidget*)ui->tableView);
connect(header, &CheckBoxHeader::checkBoxClicked, this, &OCR::onCheckBoxClicked);

ui->tableView->setHorizontalHeader(header);
ui->tableView->setModel(model);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->tableView->horizontalHeader()->setSectionResizeMode(0,QHeaderView::Fixed);
ui->tableView->setColumnWidth(0,30);
ui->tableView->setAlternatingRowColors(true);
  • 自定义数据模型类型(checkbox)
for(int i=0;i<allItem.size();i++)
{
    //自定义添加checkbox
    QWidget *widget = new QWidget(this);
    QCheckBox *checkbox = new QCheckBox();
    QHBoxLayout *hLayout = new QHBoxLayout();

    hLayout->addWidget(checkbox);
    hLayout->setMargin(0);                              // 必须添加, 否则CheckBox不能正常显示
    hLayout->setAlignment(checkbox, Qt::AlignCenter);   // 居中显示复选框
    checkbox->setProperty("isSelect", i+1);
    widget->setLayout(hLayout);

    ui->tableView->setIndexWidget(model->index(i, 0), widget);

    connect(checkbox, SIGNAL(stateChanged(int)), this, SLOT(onCheckboxStateChanged(int)));
}


void onCheckboxStateChanged(int state)
{
    QCheckBox *checkBox = qobject_cast<QCheckBox*>(sender());
    if(checkBox == NULL)
    {
        return;
    }

    QString index = checkBox->property("isSelect").toString();

    //qDebug()<<index.toInt();
    if(state == Qt::Checked)
    {

    }
    else if (state == Qt::Unchecked)
    {

    }
}
connect(ui->tableView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(onTableClicked(const QModelIndex &)));
  • 单元格选中变化事件(键盘up、down等)
connect(ui->tableView->selectionModel(), SIGNAL(currentChanged(const QModelIndex & , const QModelIndex & )), SLOT(selectedItem(const QModelIndex &)));
  • 获取单元格坐标,转成全局坐标(获取坐标后个性化显示等功能)
void OCR::onTableClicked(const QModelIndex &index)
{
    if (index.isValid()) 
    {
        int x = ui->tableView->columnViewportPosition(0);
        int y = ui->tableView->rowViewportPosition(index.row());
        //转成全局坐标
        QPoint point =  ui->tableView->viewport()->mapTo(this,QPoint(x,y));
    }
}        
  • 选中模式,单行、多行
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);//设置单击选择一行
ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);//设置只能选择一行,不能选择多行
  • 不可编辑
ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);

 

 类似资料: