2012-03-28 48 views
0

我有QTableWidget用下面的代碼的子類:如何從QTableWidgetItem中提取顯示的文本?

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▌▌ 

然而,雖然該損壞的數據被噴出了上控制檯,表格部件本身似乎表現正常,並顯示正確的字符串。有人知道這裏發生了什麼嗎?

回答

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; 
+0

這解決了問題;幫助我理解爲什麼。我認爲在C++中,一個變量不會被破壞,直到它超出範圍,並且'data'在cout'聲明之後才真正超出範圍。如果編譯器不使用,實際上是否允許先回收它? – Calvin 2012-03-28 03:46:46

+0

@Calvin'data'沒有超出範圍...但是你沒有指向'data'的指針。 'const char * cellData = data.constData()'會工作;相反,你在做'text.toAscii()。constData()'。看到不同? – tmpearce 2012-03-28 04:53:19

+0

啊哈!這就說得通了。謝謝! =) – Calvin 2012-03-28 20:27:41

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

這應該可以正常工作。至於爲什麼toAscii不是工作,我不知道。

+0

可惜,這似乎並沒有工作。我完全喪失了原因。可能是因爲「文本」被破壞得太早了? – Calvin 2012-03-28 03:44:14

+0

@Calvin那很有趣。這不應該是一個問題,雖然你可以設置一個斷點來查看是否有奇怪的事情發生,並確保文本是有效的。很高興看到你發現了一些可以工作的東西! – Lander 2012-03-28 03:50:40

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

這樣,你不必與數據轉換一塌糊塗......

相關問題