Как я могу извлечь отображаемый текст из QTableWidgetItem? - PullRequest
0 голосов
/ 28 марта 2012

У меня есть подкласс 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 ]

2 голосов
/ 28 марта 2012

Вызов 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 голосов
/ 28 марта 2012
std::string cellData = text.ToStdString();
cout << "Cell ("<<row<<", "<<column<<") changed to: " << cellData << endl;

Это должно работать нормально. Что касается того, почему toAscii не не работает, я понятия не имею.

0 голосов
/ 03 февраля 2017

Если речь идет только о выводе на консоль, вы также можете использовать 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();
}

Таким образом, вам не нужно связываться с преобразованием данных ...

...