3

我创建了一个 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:错误:无法在分配中将“QLineEdit*”转换为“QWidget*”

为什么会出现这种转换错误?

另一个子问题:将表作为参考传递可以节省内存,对吗?这可能是问题吗?我正在为诺基亚智能手机开发,我认为按值传递对象是浪费内存......(对不起,如果这是一个愚蠢的问题,但我对 C++ 和所有指针的东西有点生疏......)

4

1 回答 1

11

当您声明您的tmpLineEdit时,您应该将其声明为 aQLineEdit*而不是 a QWidget*。您的循环抓取小部件,将其转换为 a QLineEdit*,然后尝试将其放回 a QWidget*。另外,我建议使用qobject_cast<QLineEdit*>(or 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 是否也属于该类别。

于 2011-02-09T16:14:17.870 回答