我有一个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;

08-27 02:23
查看更多