QT-QTableView的使用

首先看效果图:

表格视图的使用,主要需要用到三个类:QTableView 、 QStandardItemModel、QStandardItem

QTableView 可以比作是一个空的百来平米的房子,

QStandardItemModel则是房子里的格局模型,比如你要划分几十平米做客厅,十几平米做卧室,剩下的划分为厨房等。

QStandardItem 则是具体的家具,电视,桌子,凳子等

 

所以现在mainwindow.h文件中添加相关类:

    QTableView* m_pTableView;
    QStandardItemModel* m_pModel;

当前演示程序,是直接在designer设计,所以绑定界面的控件。

m_pTableView = ui->tableView;

以及

m_pModel = new QStandardItemModel(this);

 

接下来则是初始化整个控件:(初始化代码直接全上了,还有注释)

以下主要是设计整个房子的内部格局。用QStandardItemModel。

void MainWindow::InitTableView()
{
    m_pModel = new QStandardItemModel(this);
    //设置列字段名
    m_pModel->setColumnCount(3);
    m_pModel->setHeaderData(0,Qt::Horizontal, "时间");
    m_pModel->setHeaderData(1,Qt::Horizontal, "名称");
    m_pModel->setHeaderData(2,Qt::Horizontal, "性别");

    //设置行字段名
    m_pModel->setRowCount(1);
    m_pModel->setHeaderData(0,Qt::Vertical, "1");
    //m_pModel->setHeaderData(1,Qt::Vertical, "2");

    //设置两条数据
    m_pModel->setItem(0, 0, new QStandardItem(getCurrentTime()));
    m_pModel->setItem(0, 1, new QStandardItem("张三"));
    m_pModel->setItem(0, 2, new QStandardItem("男"));
//    m_pModel->setItem(1, 0, new QStandardItem(getCurrentTime()));
//    m_pModel->setItem(1, 1, new QStandardItem("李四"));
//    m_pModel->setItem(1, 2, new QStandardItem("女"));

    m_pTableView->setModel(m_pModel);

    //设置表格属性
    m_pTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置表格只读,不能进行编辑
    m_pTableView->setShowGrid(true);   //显示网格线

    //m_pTableView->verticalHeader()->hide();  //隐藏行表头 或 table->vercalHeader()->setVisible(false);
    //m_pTableView->verricalHeader()->setDefaultSeciontSize(22);  //设置默认行高
    //m_pTableView->horizontalHeader()->setDefaultSecionSize(100);  //设置默认列宽

    //注意设置表头时需要用到头文件 #include <QHeaderView>
    m_pTableView->setSelectionBehavior(QAbstractItemView::SelectRows);  //设置选中时为整行选中
    m_pTableView->setColumnWidth(0, 100);  //设置各列宽度,注意该设置函数必须在数据模型创建并绑定之后调用才起效, 刚开始在setModel 之前调用了该函数始终没有生效
    m_pTableView->setColumnWidth(1, 100);

    //m_pTableView->setColumnsWidth();    //设置所有列宽
    m_pTableView->resizeRowToContents(1);   //根据内容调整某行的行高
    m_pTableView->resizeColumnsToContents();  //根据内容自动调整所有列的列宽

    //m_pTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 各列平均分配,并且占满整个tableview
    m_pTableView->horizontalHeader()->setStretchLastSection(true); // 自动调整最后一列的宽度使它和表格的右边界对齐
}

接下来是如何摆放家具了:

private slots:
    void onAddData(); // 添加一行数据
    void onAddRedData(); // 添加一行红色数据
    void onDeleteData(); // 删除一行数据   
    void slotClearTable(); // 清理表格

具体实现:

/************************槽函数************************/
// 添加一行数据
void MainWindow::onAddData()
{
    QList<QStandardItem*> list;
    list.append(new QStandardItem(getCurrentTime()));
    list.append(new QStandardItem("赵六"));
    list.append(new QStandardItem("女"));

    int nNewRow = m_pModel->rowCount();
    m_pModel->insertRow(nNewRow, list); //在最后一行插入一条记录
}

// 添加一行红色数据
void MainWindow::onAddRedData()
{
    QList<QStandardItem*> list;
    list << new QStandardItem(getCurrentTime()) << new QStandardItem("王五") << new QStandardItem("男");

    int nNewRow = m_pModel->rowCount();
    m_pModel->insertRow(nNewRow, list); //在最后一行插入一条记录
    // 整行变为红色
    for(int i=0;i<m_pModel->columnCount();++i)
    {
        // 背景颜色红色
        //m_pModel->item(nNewRow,i)->setBackground(QBrush(QColor(255, 0, 0)));
        // 字体颜色红色
        m_pModel->item(nNewRow,i)->setForeground(QBrush(QColor(255, 0, 0)));
    }

}

// 删除一行数据
void MainWindow::onDeleteData()
{
    int nRow = m_pTableView->currentIndex().row(); // 获取当前选中的行数
    m_pModel->removeRow(nRow);//移除第0行数据
}

// 清理表格
void MainWindow::slotClearTable()
{
    m_pModel->removeRows(0,m_pModel->rowCount());//移除第0行数据
}

演示项目链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值