Qt第九天

QTablewidget的使用

实现以下功能:

设置表格的列数和行数,设置表头的文字、格式等

初始化表格数据,设置一批实例数据填充到表格里

添加行、删除行、插入行的操作

遍历表格所有单元格,读取表格内容到一个QPlainTextEdit中

表格上选择单元格变化时,在状态栏显示单元格的存储信息

代码如下
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H


#include <QMainWindow>
#include<QLabel>
#include<QTableWidget>
#include<QString>
#include<QDate>
#include<QPlainTextEdit>


namespace Ui {
class MainWindow;
}


class MainWindow : public QMainWindow
{
    Q_OBJECT


public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();


private slots:
    void on_btnSetHeader_clicked();


    void on_btnIniData_clicked();


    void on_tableWidget_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn);


    void on_btnInsertRow_clicked();


    void on_btnAppendRow_clicked();


    void on_btnDelCurRow_2_clicked();


    void on_btnAutoHeght_clicked();


    void on_btnAutoWidth_clicked();


    void on_chkBoxTabEditable_clicked(bool checked);


    void on_chkBoxHeaderH_clicked(bool checked);


    void on_chkBoxHeaderV_pressed();


    void on_chkBoxHeaderV_clicked(bool checked);


    void on_chkBoxRowColor_clicked(bool checked);


    void on_rBtnSelectItem_clicked();


    void on_rBtnSelectRow_clicked();


    void on_btnReadToEdit_clicked();


    void on_btnSetRow_clicked();


private:
    Ui::MainWindow *ui;
private:
    //自定义单元个Type的类型,在创建单元格item时使用
    enum CellType{ctName=1000,ctSex,ctBirth,ctNation,ctPartyM,ctScore};
    //各字段在表格中的列号
    enum FieldColNum{colName=0,colSex,colBirth,colNation,colScore,colPartyM};
    //添加#include<QLabel>
    QLabel *labCellIndex;//状态栏上用于显示单元格的行号,列号
    QLabel *labCellType;//状态栏上用于显示单元格的type
    QLabel *labStudID;//状态栏上用于显示学号
    //为某一行创建items
    void createItemARow(int rowNo,QString Name, QString Sex,QDate birth,QString Nation,bool isPM,int score );
};


#endif // MAINWINDOW_H


mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QTableWidgetItem>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //状态栏初始化创建
    //主要是对三个标签初始化
    labCellIndex=new QLabel("当前单元格坐标:",this);
    labCellIndex->setMinimumWidth(250);
    labCellType=new QLabel("当前单元格类型:",this);
    labCellType->setMinimumWidth(200);
    labStudID=new QLabel("当前学生ID:",this);
    labStudID->setMinimumWidth(200);
    //将标签添加到状态栏
    ui->statusBar->addWidget(labCellIndex);
    ui->statusBar->addWidget(labCellType);
    ui->statusBar->addWidget(labStudID);
}


MainWindow::~MainWindow()
{
    delete ui;
}


//createItemARow()是自定义的函数
//下面是实现代码
//其中QTableWidgetItem::QTableWidgetItem(const QString &text,int type=Type)
//第一个参数作为单元格的显示文字,第二个参数作为节点的类型
void MainWindow::createItemARow(int rowNo, QString Name, QString Sex, QDate birth, QString Nation, bool isPM, int score)
{
    QTableWidgetItem *item;
    QString str;
    uint StudID=20180000;//学号基数
    //姓名
    item=new QTableWidgetItem(Name,MainWindow::ctName);//新建一个Item,设置单元格type为自定义的 MainWindow::ctName
    item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);//将项目文本的文本对齐方式设置为指定的对齐方式。
    StudID +=rowNo;//学号=基数+行号
    item->setData(Qt::UserRole,QVariant(StudID));//设置studID为data
    ui->tableWidget->setItem(rowNo,MainWindow::colName,item);
    //性别
    QIcon icon;
    if(Sex=="男")
    {
        icon.addFile(":/images/icons/boy.ico");
    }
    else
    {
        icon.addFile(":/images/icons/girl.ico");
    }
    item=new QTableWidgetItem(Sex,MainWindow::ctSex);//新建一个Item,设置单元格type为自定义的 MainWindow::ctSex
    item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);//将项目文本的文本对齐方式设置为指定的对齐方式。
    item->setIcon(icon);
    ui->tableWidget->setItem(rowNo,MainWindow::colSex,item);
    //出生日期
    str=birth.toString("yyyy-MM-dd");//
    item=new  QTableWidgetItem(str,MainWindow::ctBirth);//新建一个Item,设置单元格type为自定义的 MainWindow::ctBirth
    item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter); //文本对齐格式
    ui->tableWidget->setItem(rowNo,MainWindow::colBirth,item);//为单元格设置Item
    //名族
    item=new  QTableWidgetItem(Nation,MainWindow::ctNation); //新建一个Item,设置单元格type为自定义的 MainWindow::ctNation
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//文本对齐格式
    ui->tableWidget->setItem(rowNo,MainWindow::colNation,item);//为单元格设置Item
    //是否党员
    item=new  QTableWidgetItem("党员",MainWindow::ctPartyM);//新建一个Item,设置单元格type为自定义的 MainWindow::ctPartyM
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//文本对齐格式
    if (isPM)
       item->setCheckState(Qt::Checked);//设置单元个勾选状态,被选中
    else
       item->setCheckState(Qt::Unchecked);//未被选
    item->setBackgroundColor(Qt::yellow);//Qt::green  lightGray  yellow
    ui->tableWidget->setItem(rowNo,MainWindow::colPartyM,item);//为单元格设置Item
    //分数
    str.setNum(score);
    item=new  QTableWidgetItem(str,MainWindow::ctScore);//新建一个Item,设置单元格type为自定义的 MainWindow::ctPartyM
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//文本对齐格式
    ui->tableWidget->setItem(rowNo,MainWindow::colScore,item);//为单元格设置Item
}


void MainWindow::on_btnSetHeader_clicked()//设置表头
{
    QTableWidgetItem *headerItem;
    QStringList headerText;
    headerText<<"姓 名"<<"性 别"<<"出生日期"<<"民 族"<<"分数"<<"是否党员";  //表头标题用QStringList来表示
                                                                      //可以插入一串字符串
    //ui->tableWidget->setHorizontalHeaderLabels(headerText);
    ui->tableWidget->setColumnCount(headerText.count());
    for(int i=0;i<ui->tableWidget->columnCount();i++)
    {
        headerItem=new QTableWidgetItem(headerText.at(i));//字符串写入单元格
        //设置字体
        QFont font=headerItem->font();
        font.setBold(true);//粗体
        font.setPointSize(12);//字号12
        headerItem->setFont(font);
        headerItem->setTextColor(Qt::red);//字色红色
        ui->tableWidget->setHorizontalHeaderItem(i,headerItem);
    }
}




void MainWindow::on_btnIniData_clicked()//初始化数据
{
    QString strName,strSex;
    bool    isParty=false;
    QDate   birth;
    birth.setDate(1980,4,7);//初始化一个日期
    ui->tableWidget->clearContents();//只清除工作区,不清除表头


    int Rows=ui->tableWidget->rowCount(); //获得数据区行数,
    for (int i=0;i<Rows;i++) //数据区第1行的编号为0,所以范围是0~rowCount()-1
    {
        strName=QString::asprintf("学生%d",i); //姓名:学生i
        if ((i % 2)==0) //分奇数,偶数行设置性别,及其图标
            strSex="男";
        else
            strSex="女";


        createItemARow(i, strName, strSex, birth,"汉族",isParty,70); //为某一行创建items


        birth=birth.addDays(20); //日期加20天
        isParty =!isParty;//下一行不是党员
    }
}


void MainWindow::on_tableWidget_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)
{
    Q_UNUSED(previousRow);
    Q_UNUSED(previousColumn);


     QTableWidgetItem* item=ui->tableWidget->item(currentRow,currentColumn); //获取当前单元格的 Item
     if  (item==NULL)
         return;
     //显示当前单元格坐标的标签
     labCellIndex->setText(QString::asprintf("当前单元格坐标:%d 行,%d 列",currentRow,currentColumn));
     //显示当前单元格类型的标签
     int cellType=item->type();//获取单元格的类型
     labCellType->setText(QString::asprintf("当前单元格类型:%d",cellType));
     //显示当前单元格学号的标签
     item=ui->tableWidget->item(currentRow,MainWindow::colName); //取当前行第1列的单元格的 item
     //data()函数提取自定义数据,用户在创建单元格是存储的学生ID
     int ID=item->data(Qt::UserRole).toInt();//读取用户自定义数据
     labStudID->setText(QString::asprintf("学生ID:%d",ID));//学生ID
}


void MainWindow::on_btnInsertRow_clicked()//插入行
{
    int curRow=ui->tableWidget->currentRow();
    ui->tableWidget->insertRow(curRow);//插入一行,无数据
    createItemARow(curRow,"新学生","女",QDate::fromString("1999-9-9","yyyy-M-d"),"回族",true,100);//为新插入的行添加数据
}


void MainWindow::on_btnAppendRow_clicked()//添加行
{
    int curRow=ui->tableWidget->rowCount();
    ui->tableWidget->insertRow(curRow);//插入一行,无数据
    createItemARow(curRow,"新学生","女",QDate::fromString("2999-9-9","yyyy-M-d"),"维吾尔族",true,1000);//为新插入的行添加数据
}


void MainWindow::on_btnDelCurRow_2_clicked()//删除当前行,使用removeRow函数
{
    int curRow=ui->tableWidget->currentRow();
    ui->tableWidget->removeRow(curRow);
}




void MainWindow::on_btnAutoHeght_clicked()//自动调节行高
{
    ui->tableWidget->resizeRowsToContents();//对所有行
}


void MainWindow::on_btnAutoWidth_clicked()//自动调节列宽
{
    ui->tableWidget->resizeColumnsToContents();//对所有列
}


void MainWindow::on_chkBoxTabEditable_clicked(bool checked)
{
    if(checked)
    {
        ui->tableWidget->setEditTriggers(QAbstractItemView::DoubleClicked|QAbstractItemView::SelectedClicked);
                                         //双击或获取焦点后单击,进入编辑状态
    }
    else
    {
        ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
    }
}




void MainWindow::on_chkBoxHeaderH_clicked(bool checked)//行表头是否显示
{
    ui->tableWidget->horizontalHeader()->setVisible(checked);
}


void MainWindow::on_chkBoxHeaderV_pressed()
{


}


void MainWindow::on_chkBoxHeaderV_clicked(bool checked)//列表头是否显示
{
    ui->tableWidget->verticalHeader()->setVisible(checked);
}




void MainWindow::on_chkBoxRowColor_clicked(bool checked)//间隔行底色
                                                        //间隔的一行用灰色底色
{
    ui->tableWidget->setAlternatingRowColors(checked);
}


void MainWindow::on_rBtnSelectItem_clicked()//选择单元格
{
    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems);
}


void MainWindow::on_rBtnSelectRow_clicked()//行选择
{
    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
}


void MainWindow::on_btnReadToEdit_clicked()
{
    QString str;
    QTableWidgetItem *cellItem;
    ui->plainTextEdit->clear(); //文本编辑器清空
    for (int i=0;i<ui->tableWidget->rowCount();i++) //逐行处理
    {
        str=QString::asprintf("第 %d 行: ",i+1);
       for (int j=0;j<ui->tableWidget->columnCount()-1;j++) //逐列处理,但最后一列是check型,单独处理
        {
            cellItem=ui->tableWidget->item(i,j); //获取单元格的item
            str=str+cellItem->text()+"   "; //字符串连接
        }
       cellItem=ui->tableWidget->item(i,colPartyM);  //最后一列,党员
       if (cellItem->checkState()==Qt::Checked)  //根据check状态显示文字
           str=str+"党员";
       else
           str=str+"群众";
       ui->plainTextEdit->appendPlainText(str); //添加到编辑框作为一行
    }
}


void MainWindow::on_btnSetRow_clicked()//设置行数
{
    int rowC=ui->spinBox->value();
    ui->tableWidget->setRowCount(rowC);
}

mainwindow.ui
在这里插入图片描述运行结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/theRookie1/article/details/84817339