我有一个QTableWidget
的子类,带有以下代码:
connect(this, SIGNAL(cellChanged(int, int)), this, SLOT(pushCellChange(int, int)), Qt::QueuedConnection);
...
void MyTableView::pushCellChange(int row, int column)
{
QString text(item(row, column)->text());
QByteArray data = text.toAscii();
cout << data.length() << endl;
const char* cellData = text.toAscii().constData();
cout << "Cell ("<<row<<", "<<column<<") changed to: " << cellData << endl;
}
当我将右上角的单元格更改为任何内容时,将输出:
2
Cell (0, 0) changed to: ▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌░▬∟C▌▌
但是,虽然在控制台上喷出了这些损坏的数据,但表小部件本身似乎表现正常,并显示正确的字符串。有人知道这是怎么回事吗?
最佳答案
呼叫toAscii()
将QString
的数据存储到QByteArray
。在您的代码中,您需要执行两次:
QByteArray data = text.toAscii();
const char* cellData = text.toAscii().constData();
_____________^ <-- temporary QByteArray
const char*
实际上指向临时变量内的数据,该临时变量超出了分号的范围,此时指针变为无效。相反,如果要使用局部变量data
,则可以:const char* cellData = data.constData();
___^ <-- still-in-scope QByteArray
或者,您可以使用cout内联完成所有操作,并且将数据复制到输出流后,数据仍然有效:
cout << "Cell ("<<row<<","<<column<<") changed to: " << text.toAscii().constData() << endl;