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 好用的信号函数
写代码的时候怎么识别这个函数是个信号函数呢,我偶然发现
上图红框框中的这种函数,就是信号函数,很形象的图标。
项目中,我有两个需求,就是当我选中某一行的时候,我需要做某些操作。 当我双击修改了某一行的内容之后,我需要做一些操作。 这两个事件,其实 QTableWidget早就已经为你考虑过了,这两种事件,它都会发送信号。 因此我们可以将这个信号连接到槽函数处理。
选中某行-程序1
// 选中某行
connect(ui->tableWidget,&QTableWidget::itemSelectionChanged,this,[=](){
// 选中的单元格
QList<QTableWidgetItem*> 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<QTableWidgetSelectionRange> 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;i<m_strPathList.count(); i++)
{
// 获得当前表格的行数
rown = ui->tableWidget->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按键,看帮助文档,这个靠谱
最后愿我们共同进步! 感谢您的阅读,欢迎留言讨论、收藏、点赞、分享。