0

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

然而,虽然这些损坏的数据在控制台上喷涌而出,但表格小部件本身似乎表现正常并显示了正确的字符串。有谁知道这里发生了什么?

4

3 回答 3

2
std::string cellData = text.ToStdString();
cout << "Cell ("<<row<<", "<<column<<") changed to: " << cellData << endl;

那应该可以正常工作。至于为什么toAscii 不起作用,我不知道。

于 2012-03-28T03:24:01.643 回答
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;
于 2012-03-28T03:27:13.877 回答
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();
}

这样,你就不用搞数据转换了……</p>

于 2017-02-03T09:12:36.527 回答