我有一个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▌▌
但是,虽然这个损坏的数据在控制台上被喷出,但表格小部件本身似乎正常运行并显示正确的字符串。有谁知道这里发生了什么?
答案 0 :(得分:2)
std::string cellData = text.ToStdString();
cout << "Cell ("<<row<<", "<<column<<") changed to: " << cellData << endl;
这应该可以正常工作。至于为什么toAscii
没有工作,我不知道。
答案 1 :(得分:2)
致电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;
答案 2 :(得分:0)
如果它只是控制台输出,你也可以使用qDebug()(#include <QDebug>
之后可用)并直接传递QString
:
void MyTableView::pushCellChange(int row, int column)
{
qDebug() << item(row, column)->text().length();
qDebug() << "Cell (" << row << ", " << column << ") changed to: "
<< item(row, column)->text();
}
这样,您就不必乱用数据转换...