Qt学习_17_一些关于QTableWidget的记录

1 QTableWidget::clear() 程序异常退出

近日,项目中使用到QTableWidget,遇到一个问题,项目需要清空这个表格,但是无论调用clear(),clearContents(),程序都报:程序异常退出。 而且项目程序还比较多,最开始还没办法一步定位到是调用QTableWidget的clear()函数导致的崩溃。甚至都不知道是QTableWidget出了问题,所以需要一步一步定位,我的定位方法是:

代码1
qDebug() << "测试点1";
代码2
qDebug() << "测试点2";
代码3
qDebug() << "测试点3";
代码4
qDebug() << "测试点4";
代码5
qDebug() << "测试点5";
代码6
qDebug() << "测试点6";
代码7
qDebug() << "测试点7";
...

原理很简单,如果代码几的运行是正常的, 那么程序输出界面就会打印测试点几,反正,代码几就是不正常的。我用这个方法定位到是调用了QTableWidget clear()函数导致的崩溃。  我估计是因为我在QTableWidget插入了【自定义控件/非标准的控件】作为元素了,然后我尝试用clearContents(), remove*(),各种函数来清空这个表格。 但是全都会导致崩溃,报程序异常退出。 网上也查了一些资料,也不管用。 最后我抱着试一试的心态,调用了QTableWidget的reset()函数,问题解决了,但是我也不知道为什么,没有深究。 这里把代码简单记录一下

// 清空表格
m_fs_formula_array.clear(); // 此向量保存插入表格的非标准控件(公式控件,以后会讲) 
    
// 根据行数和列数把每个单元格的控件删除
for(int i = 0; i < ui->tableWidget->rowCount();i++)
{
    for(int j = 0; j < ui->tableWidget->columnCount();j++){
        ui->tableWidget->removeCellWidget(i,j);
    }
}
ui->tableWidget->reset(); // 这句很关键,就这个reset顶用了
ui->tableWidget->clear();

 2 QTableWidget 好用的信号函数

写代码的时候怎么识别这个函数是个信号函数呢,我偶然发现

Qt学习_17_一些关于QTableWidget的记录_第1张图片

上图红框框中的这种函数,就是信号函数,很形象的图标。

项目中,我有两个需求,就是当我选中某一行的时候,我需要做某些操作。 当我双击修改了某一行的内容之后,我需要做一些操作。  这两个事件,其实 QTableWidget早就已经为你考虑过了,这两种事件,它都会发送信号。 因此我们可以将这个信号连接到槽函数处理。

选中某行-程序1

// 选中某行
connect(ui->tableWidget,&QTableWidget::itemSelectionChanged,this,[=](){
    // 选中的单元格
    QList items = ui->tableWidget->selectedItems();
    // 获取选中的行   
    int row = ui->tableWidget->row(items.at(0));
    // 获取(row,i)处的单元格    
    QTableWidgetItem* item = ui->tableWidget_dataselect->item(row,0);    
    // 获取单元格文本
    QString itemstr= item->text();
        
    // use row | itemstr  do something
});

选中某行-程序2 

// 选中某行
connect(ui->tableWidget,&QTableWidget::itemSelectionChanged,this,[=](){
    // 获取选中行
    QList ranges = ui->tableWidget->selectedRanges();
    int row = ranges.at(0).topRow();
    // use row do sth.
});

修改表格事件

connect(ui->tableWidget, SIGNAL(cellChanged(int,int)), \ 
this, SLOT(slot_namechanged(int, int)));

这个槽函数slot_namechanged(int, int)需要在.h文件中去声明,.cpp文件中去定义。

3 QTableWidget 常用代码

// 隐藏垂直的表头
ui->tableWidget->verticalHeader()->setVisible(false);
// 隐藏水平的表头
ui->tableWidget->horizontalHeader()->setVisible(false);
// 垂直方向铺满
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

// 清空表格
ui->tableWidget->clear();
// 设置表格的行数和列数
ui->tableWidget->setColumnCount(1);
ui->tableWidget->setRowCount(0);

// 设置被选中的背景色
ui->tableWidget->setStyleSheet("selection-background-color:#FA8072");

int rown;
int i;
for(i = 0;itableWidget->rowCount();
    // 在最后一行插入一行
    ui->tableWidget->insertRow(rown);
    // 设置 第rown+1行,1列的内容
    ui->tableWidget->setItem(rown, 0, new QTableWidgetItem(m_strNameList[i]));
    // 设置内容居中
    ui->tableWidget->item(rown, 0)->setTextAlignment(Qt::AlignCenter);
}

// 代码来选中某行
ui->tableWidget_dataselect->selectRow(rown);
QLabel* widget = new QLabel(); 
// 对这个widget一顿操作
ui->tableWidget->setRowHeight(rown, 200);   // 设置行高
ui->tableWidget->setCellWidget(rown, 0, widget); // 设置表格元素为某个控件

其实QTableWidget的相关知识,还是选中QTableWidget,双击F1按键,看帮助文档,这个靠谱

Qt学习_17_一些关于QTableWidget的记录_第2张图片

最后愿我们共同进步! 感谢您的阅读,欢迎留言讨论、收藏、点赞、分享。

你可能感兴趣的:(QT学习,qt,学习,QTableWidget)