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ます。コードでは、これを 2 回行います。

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 に答える