如何从QTableWidgetItem中提取显示的文本?

时间:2012-03-28 03:12:20

标签: c++ qt corruption qtablewidget qtablewidgetitem

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

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

3 个答案:

答案 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();
}

这样,您就不必乱用数据转换...