【qt】QTableWidget 表格组件1:https://developer.aliyun.com/article/1523067
5.添加每个单元格
①:设置单元格信息
我们可以来创建一个函数来实现我们行信息的初始化,这里使用了随机数来模拟我们的数据。
QStringList jobs={"开发商","高级工程师","架构师","程序员","牛马"}; for(int i=0;i<rows;i++) { MaxNo++;//每创建一行,我就计数加1 creatRows(i,QString::asprintf("员工%d",MaxNo),MaxNo,rand()%2?"男":"女", QDate(rand()%2000+10,rand()%12+1,rand()%30+1),jobs[rand()%5],rand()%2); }
在mainwindow.cpp中添加一个成员函数和一个计数的MaxNo,记得对于时间参数姚家一个头文件。
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QDate> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: Ui::MainWindow *ui; void initUI(); int MaxNo; void creatRows(int rowNumber,QString name,int number,QString gender,QDate birthday,QString job,bool married); }; #endif // MAINWINDOW_H
②:添加单元格
基本逻辑就是先创建一个单元格,然后用setItem来加到表格中。
void MainWindow::creatRows(int rowNumber,QString name,int number,QString gender,QDate birthday,QString job,bool married) { QTableWidgetItem*item=new QTableWidgetItem(name); item->setData(Qt::UserRole,QVariant(number));//添加附加值 ui->tableWidget->setItem(rowNumber,0,item);//设置单元格信息 item=new QTableWidgetItem(gender); QIcon icon; if(gender=="男") { icon.addFile(":/image/boy.png"); } else { icon.addFile(":/image/girl.png"); } item->setIcon(icon);//这个是显示图片的,下面的截图忘记添加了 ui->tableWidget->setItem(rowNumber,1,item); item=new QTableWidgetItem(birthday.toString("yyyy-MM-dd")); ui->tableWidget->setItem(rowNumber,2,item); item=new QTableWidgetItem(job); ui->tableWidget->setItem(rowNumber,3,item); item=new QTableWidgetItem(married?"已婚":"未混"); if(married) { item->setBackground(Qt::gray);//还可以设置背景色 } ui->tableWidget->setItem(rowNumber,4,item); }
③:单元格附加值
item->setData(Qt::UserRole,QVariant(number));//添加附加值
④:单元格文本对其方式
现在的运行结果:
我们可以发现我们单元格的信息没有居中,我们可以通过setTextAlignment接口来设置
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
参数可以在F1文档中去查找:
运行结果:
哈哈,我们的表格就生成好了,是不是很完美哈哈,接下来我们要来添加功能了,让表格动起来!
三.编辑功能
1.编辑逻辑
就是有一个接口可以设置表格编辑的触发器,来使我们可以控制表格是否可以被编辑。
2.设置编辑触发器
默认状态下表格是可以进行编辑的
现在我们来设置不能对其进行编辑。
在mianWindow的构造函数里添加
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
参数还是可以通过F1在线文档去找。
现在就不可以编辑了。
3.实现编辑action
根据是否打开复选框acyion来设置编辑触发器的模式来控制是否能编辑。
void MainWindow::on_actionEdit_triggered(bool checked) { if(checked) { //双击和选中单击都可以进行编辑 ui->tableWidget->setEditTriggers(QAbstractItemView::DoubleClicked|QAbstractItemView::SelectedClicked); } else { //禁止编辑 ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); } }
运行结果:
四.插入功能
1.插入逻辑
我们要获取我们鼠标的位置来确定我们要插入的位置,其次插入有一个接口可以实现插入一行,但是是空行,所以首先需要我们先创建一行。
2.获取当前行
int currentRow=ui->tableWidget->currentRow();
3.插入行
通过我们刚刚的函数来创建行信息
MaxNo++;//插一行计算加1 ui->tableWidget->insertRow(currentRow); creatRows(currentRow,"未知",MaxNo,"男",QDate(2000,1,1),"未知",false);
4.选择新行
现在有个问题就是当我插入新行时,他会选择刚刚插入的那个位置,而不是我们新插入的位置。
解决办法:
ui->tableWidget->selectRow(currentRow);
5.能否编辑
现在还有一个问题,我们新插入的数据居然不能编辑,这不就插了更没有插入一样的嘛。
void MainWindow::on_actionInsert_triggered() { int currentRow=ui->tableWidget->currentRow(); //对当前行添加信息 MaxNo++; ui->tableWidget->insertRow(currentRow); ui->tableWidget->selectRow(currentRow); creatRows(currentRow,"未知",MaxNo,"男",QDate(2000,1,1),"未知",false); on_actionEdit_triggered(true);//插入的时候,可以将编辑功能打开 }
现在就可以进行编辑了。
但是又出现一个小问题
就是我们肯定只希望只能编辑插入的数据,结果这样一开,所有的行都能编辑了。
解决方案:我们可以通过表格的信号来判断,我当前的光标位置是不是在我刚刚插入的位置,是就打开编辑,不是就关闭编辑。
如果默认打开编辑功能,那这种情况不存在。
选择这个信号:
在插入功能函数中记录插入的位置
insertRow=currentRow;
void MainWindow::on_tableWidget_itemSelectionChanged() { if(ui->actionEdit->isChecked()) return; if(insertRow==ui->tableWidget->currentRow()) { on_actionEdit_triggered(true); } else { on_actionEdit_triggered(false); } }
运行结果:
【qt】QTableWidget 表格组件3:https://developer.aliyun.com/article/1523077