Qt 判断QTableWidget的item是否为空,调用ui->tableWidget->item(i,j)->text()程序崩溃

问题:

        判断QTableWidget的item是否为空时,调用ui->tableWidget->item(i,j)->text()程序崩溃。

       

原因:

  • (1)如果是没有被编辑过的单元格,将不能用ui->tableWidget->item(i,j)->text()访问,因为该指针ui->tableWidget->item(i,j)为NULL。
  • (2)如果被编辑过,此时指针不为空了,但内容仍然是空(例如text()==tr("")),则可以用ui->tableWidget->item(i,j)->text().isEmpty()判断。

       

代码:

// 判断指向该item的指针是否为空 || 判断该item的text是否为空
if(ui->tableWidget_bsdl->item(i,j)==nullptr || ui->tableWidget_bsdl->item(i,j)->text().isEmpty())  
{    
}

       

解释:

  • (1)因为C++逻辑或和逻辑与采用短路求值策略:对于逻辑或运算,当且仅当左侧运算对象为假时,才对右侧运算对象求值。
  • (2)当ui->tableWidget->item(i,j)==nullptr为真时,是空指针,此时左侧运算对象为真,不会对右侧运算对象求值,即,不会用空指针去访问->text(),不会判断ui->tableWidget->item(i,j)->text()是否为空,是安全的。
  • (3)当ui->tableWidget->item(i,j)==nullptr为假时,不是空指针,此时才对||的右侧运算对象求值,又因为它不是空指针,所以用它访问->text()是安全的。

       

我是看了这篇文章【Qt开发】QTableWidget 判断cell内容为空
才知道为啥判断QTableWidget的item是否为空时,调用ui->tableWidget->item(i,j)->text()程序崩溃。但把原文章的if条件改了一下。

  • 18
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要在`onGetProtocolData()`函数中调用`AddDataToList()`函数,并使用`moveToThread`实现多线程,可以按照以下步骤进行操作: 1. 创建一个新的线程对象,并将其设置为`AddDataToList`函数的父对象。这将确保在新线程中执行`AddDataToList`函数。 ```cpp QThread* thread = new QThread(this); ``` 2. 创建一个新的对象来执行`AddDataToList`函数。这个对象应该是继承自`QObject`类,并且实现了`AddDataToList`函数的逻辑。 ```cpp class DataProcessor : public QObject { Q_OBJECT public: explicit DataProcessor(QObject* parent = nullptr) : QObject(parent) {} public slots: void AddDataToList(QStringList strList) { if(!ui->checkBox_4->checkState()) return; int row = ui->tableWidget->rowCount(); ui->tableWidget->insertRow(row); for(int i = 0; i < strList.count();i ++) { QTableWidgetItem *item = new QTableWidgetItem(strList.at(i),0); ui->tableWidget->setItem(row, i, item); if(i != strList.count() - 1) ui->tableWidget->item(row,i)->setTextAlignment(Qt::AlignCenter | Qt::AlignHCenter); } ui->tableWidget->scrollToBottom(); } }; ``` 3. 将新对象移动到新线程中。 ```cpp DataProcessor* dataProcessor = new DataProcessor(); dataProcessor->moveToThread(thread); ``` 4. 连接`onGetProtocolData()`函数和`AddDataToList()`函数。这将确保当`onGetProtocolData()`函数被调用时,`AddDataToList()`函数将在新线程中执行。 ```cpp connect(this, &UserWindow::onGetProtocolData, dataProcessor, &DataProcessor::AddDataToList); ``` 5. 启动新线程。 ```cpp thread->start(); ``` 最后,在`onGetProtocolData()`函数中,通过发送信号来调用`AddDataToList()`函数。 ```cpp emit onGetProtocolData(strList); ``` 这样,当调用`onGetProtocolData()`函数时,`AddDataToList()`函数将在新线程中执行。请注意,如果在`AddDataToList()`函数中有与GUI相关的操作,需要使用适当的方式进行跨线程通信,以确保线程安全。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值