QTableWidget部件使用

一、部件说明

qtablewidget部件常用来作为qt界面表格显示工具,qtablewidget是qtableview的子类,其区别是qtableview可以使用自定义的数据模型来显示内容,而qtablewidget只能使用标准的数据模型,并且其数据单元格是QTableWidgetItem的对象来实现的,即不需要数据源绑定。

二、部件使用

1、设置表单样式

   //设置列数
    m_p->setColumnCount(6);
    //设置水平表头
    m_p->setHorizontalHeaderLabels(QStringList()<<"序号"\
                                               <<"器件名称"<<"规格型号"<<"数量(个)"\
                                               <<"备注(制造商)"<<"编码");
    //设置表头颜色
    m_p->horizontalHeader()->setStyleSheet("QHeaderView::section{background:skyblue;}");//天蓝色填充表头
    m_p->setSelectionBehavior(QAbstractItemView::SelectRows);//设置表格选择方式:设置表格为整行选中
    m_p->setSelectionMode(QAbstractItemView::SingleSelection);//选择目标方式
    m_p->setStyleSheet("selection-background-color:blue");//设置选中行颜色:蓝色
    //m_p->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);//设置水平滚动条
    m_p->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);//设置垂直滚动条
    //设置列占满表格,列可以调宽,间隔可拉伸
    m_p->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    m_p->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Interactive);
    m_p->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Interactive);
    //m_p->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Interactive);
    m_p->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Interactive);
    m_p->horizontalHeader()->setSectionResizeMode(4, QHeaderView::Interactive);
    //ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置编辑方式:禁止编辑表格

2、表格操作

加载数据

//加载默认数据到表格
void tableWidgetSet::tableSet()
{
    //设置默认行数
    tabui->ui->tableWidget->setRowCount(4);
    QStringList nameList;
    nameList<<"23-xxx"<<"24-xxx"<<"20-xxx"<<"21-xxx";
    QList<QString>deviceList;
    deviceList<<"均"<<"保"<<"保"<<"he";
    QList<QString>list3,list4,list5,list6;
    list3<<"R"<<"b"<<"R"<<"T";
    list4<<"60"<<"3"<<"0"<<"0";
    list5<<"Ω"<<"μ"<<"Ω"<<"A";
    list6<<"3"<<"3"<<"3"<<"6";
    for(int i=0;i<deviceList.size();i++)
    {
          int col = 0;
          tabui->ui->tableWidget->setItem(i,col++,new QTableWidgetItem(nameList[i]));//第一行第一列
          tabui->ui->tableWidget->setItem(i,col++,new QTableWidgetItem(deviceList.at(i)));//第一行第二列

          tabui->ui->tableWidget->setItem(i,col++,new QTableWidgetItem(list3.at(i)));
          tabui->ui->tableWidget->setItem(i,col++,new QTableWidgetItem(list4.at(i)));
          tabui->ui->tableWidget->setItem(i,col++,new QTableWidgetItem(list5.at(i)));
          tabui->ui->tableWidget->setItem(i,col++,new QTableWidgetItem(list6.at(i)));

    }
}

插入行

//添加行数据
void tableWidgetSet::add_line(QTableWidget *tab)
{
    //int curRow = addtab->currentRow();//获取当前行号,在之上插入
    int curRow = tab->rowCount();//在尾行插入
    tab->insertRow(curRow);
}

删除行

//删除行数据
void tableWidgetSet::delete_line(QTableWidget *tab)
{
    int curRow = tab->currentRow();//获取当前行号
    tab->removeRow(curRow);//删除当前行及数据
}

获取当前行号

//获取当前行号
void tableWidgetSet::table_row()
{
    QList<QTableWidgetSelectionRange> ranges = s_tab->selectedRanges();
    if(ranges.count() == 0)
    {
        qDebug() << QStringLiteral("请选择一行");
    }
    else
    {
        for(int i  = 0; i < ranges.count(); i++)
        {
                int topRow=ranges.at(i).topRow();
                int bottomRow=ranges.at(i).bottomRow();

            for(int j = topRow; j <= bottomRow; j++)
           {
              qDebug()<<"当前选择行号为:"<<j;
              row = j;

           }
        }
    }

}

导入excel数据

//导入数据
void tableWidgetSet::excel_read(QTableWidget *tab,QWidget *p)
{
    //弹出文件选择框
    QString strData;
    QString curPash =QDir::currentPath(); //获取当前路径
    QString dlgTitle="选择表格文件";
    //xls和xlsx格式的文件都可以,xlsx兼容xls,注意每一种类型后面要加两个分号
    QString filter="表格文件(*.xls *.xlsx);;xls文件(*.xls);;xlsx文件(*.xlsx);;所有文件(*.*)";
    //创建文件选择对话框
    QStringList fileList = QFileDialog::getOpenFileNames(p,dlgTitle,curPash,filter);
    if(fileList.count()<1)
        return;
    for(int i = 0;i<fileList.count();i++)
    {
        //保存文件地址
        strData = fileList.at(i);
    }
    qDebug()<<strData;

    //读取excel数据
    QXlsx::Document Rxlsx(strData);
    int rowlen = Rxlsx.dimension().rowCount();//获取行数
    int columnlen = Rxlsx.dimension().columnCount();//获取列数
    tab->setRowCount(rowlen-1);//设置行数
    for(int i=0;i<rowlen;i++) //遍历数据
    {
        for(int j=0;j<columnlen;j++)
        {
           QString str = Rxlsx.read(i+2,j+1).toString();
           tab->setItem(i,j,new QTableWidgetItem(str));
        }
    }
}

导出数据到excel

//导出设置
void tableWidgetSet::excel_write(QString &path,QTableWidget *tab)
{
    QString excelPath;
    excelPath = path+"/"+QString("%1.xlsx").arg("器件选型表");

    QList<QString>headline;
    QTableWidgetItem *cellItem;
    QXlsx::Document xlsx;
    QXlsx::Format format1;
    format1.setFontBold(true);
    format1.setFillPattern(QXlsx::Format::PatternSolid);//填充样式
    format1.setPatternBackgroundColor(Qt::lightGray);//单元格背景
    headline<<"序号"<<"器件名称"<<"规格型号"\
           <<"数量(个)"<<"备注(制造商)"<<"编码";
    //写表头
    for(int a=0;a<tab->columnCount();a++)
    {
        xlsx.write(1,a+1,headline.at(a),format1);
    }
    for(int i=0;i<tab->rowCount();i++)
    {
        for(int j=0;j<tab->columnCount();j++)
        {
            //获取单元格item
            cellItem = tab->item(i,j);
            //如果单元格为空,自动填入NULL占位,否则程序会崩溃
            if(cellItem==NULL)
            {
                   cellItem = new QTableWidgetItem("NULL");
            }
            xlsx.write(i+2,j+1,cellItem->text());
        }
    }

    xlsx.saveAs(excelPath);
    qDebug()<<path;
}

双击事件

//关联双击table事件
    connect(ui->tableWidget,SIGNAL(cellDoubleClicked(int,int)),this,SLOT(showDialog(int,int)));

三、过程中问题记录

1、获取单元格内容时使用Text()函数导致程序崩溃
经测试text()函数获取内容单元格为空值时,程序会崩溃,类似的在写入表格时为空值也会崩溃
解决方法://先获取单元格item tab->item(i,j);再做判断,为空则填入字符占位。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值