Получить значение ячеек QTableWidget, которые являются виджетами QLineEdit - PullRequest
2 голосов
/ 09 февраля 2011

Я создаю 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;
}

Но здание терпит неудачу с этой ошибкой:

/ дома / testpec / SRC / Nokia QT / MoneyTracker-сборка-тренажер /../ MoneyTracker / calculator.cpp: 11: ошибка: невозможно преобразовать ‘QLineEdit *’ в ‘QWidget *’ в задании

Почему эта ошибка преобразования?

Еще один подвопрос: передача таблицы в качестве ссылки экономит память, верно? Может ли это быть проблемой? Я занимаюсь разработкой для смартфона Nokia, и я думаю, что передача объекта по значению - это пустая трата памяти ... (извините, если это глупый вопрос, но я немного устала от C ++ и всего, что связано с указателями ...)

1 Ответ

11 голосов
/ 09 февраля 2011

Когда вы объявляете ваш 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 также входит в эту категорию.

...