2011-02-09 42 views
2

我創建了一個QLineEdit的價值,樹立了驗證,並把它放在桌子上使用此代碼:檢索QTableWidget的細胞中,QLineEdit的部件

ui->moneyTableWidget->setCellWidget(rowsNum, 1, newQLineEdit); 

然後我有另一類操作表的數據做一列的每個值的總和。下面的代碼:

int Calculator::calculatePricesSum(QTableWidget &moneyTableWidget){ 
    double total = 0; 
    QWidget *tmpLineEdit; 
    QString *tmpString; 
    for(int row=0; row<moneyTableWidget.rowCount(); row++){ 
     tmpLineEdit = (QLineEdit*)moneyTableWidget.cellWidget(row,1);  
     tmpString = tmpLineEdit.text(); 
     total += tmpString->toDouble(); 
    } 
    return total; 
} 

但建築失敗,此錯誤:

/home/testpec/src/nokia QT/MoneyTracker-build-simulator/../MoneyTracker/calculator.cpp:11: error: cannot convert ‘QLineEdit*’ to ‘QWidget*’ in assignment

爲什麼這樣皈依錯誤?

另一個子問題:傳遞表作爲參考可以節省內存嗎?這可能是問題嗎?我開發的諾基亞智能手機,我認爲通過價值傳遞對象是浪費內存......(對不起,如果是一個愚蠢的問題,但我有點生鏽與C++和所有指針的東西...)

回答

11

當你聲明你的tmpLineEdit時,你應該聲明它爲QLineEdit*而不是QWidget*。你的循環抓取小部件,將其轉換爲QLineEdit*,然後嘗試將其放回QWidget*。另外,我建議使用qobject_cast<QLineEdit*>(或dynamic_cast),以便確保演員成功。

int Calculator::calculatePricesSum(QTableWidget &moneyTableWidget){ 
    double total = 0; 
    QLineEdit* tmpLineEdit; 
    QString tmpString; 
    for(int row=0; row < moneyTableWidget.rowCount(); row++) 
    { 
     tmpLineEdit = qobject_cast<QLineEdit*>(moneyTableWidget.cellWidget(row,1)); 
     if(NULL == tmpLineEdit) 
     { 
      // Do something to indicate failure. 
     } 
     tmpString = tmpLineEdit->text(); 
     total += tmpString.toDouble(); 
    } 
    return total; 
} 

關於你的第二個問題,通過引用傳遞可能是一個好主意 - 我知道一些類的QT(QImage的特別)使用引用計數的和隱含共享,這樣就可以按值傳遞周圍無擔心大型複製操作的影響,但我不確定QTableWidget是否也屬於該類別。