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*」に変換できません

この変換エラーはなぜですか?

別のサブ質問: テーブルを参照として渡すと、メモリが節約されますか? これが問題でしょうか?Nokiaスマートフォン用に開発していますが、オブジェクトを値で渡すのはメモリの無駄だと思います...(ばかげた質問で申し訳ありませんが、C ++とすべてのポインターに少し慣れていません...)

4

1 に答える 1

11

your を宣言するときは、ではなくtmpLineEditとして宣言する必要があります。ループはウィジェットを取得し、それを a にキャストしてから、 aに戻そうとします。また、キャストが確実に成功するように(または) を使用することをお勧めします。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;
}

2番目の質問については、参照渡しはおそらく良い考えです.Qtの一部のクラス(特にQImage)は参照カウントと暗黙的な共有を使用しているため、大きなコピーの影響を心配することなく値で渡すことができます.操作ですが、QTableWidget もそのカテゴリに含まれているかどうかはわかりません。

于 2011-02-09T16:14:17.870 に答える