0

model->setData() メソッド呼び出しを使用してこれを行うにはどうすればよいですか?

QStandardItemModel から「MyStandardItemModel」というクラスを派生させました。保護された仮想フラグ メソッドをオーバーライドして、3 番目と 4 番目の列を編集不可にしました。これはそれがどのようになるかです:

#define TX_PACKET_COLUMN (4u)
#define RX_PACKET_COLUMN (5u)

Qt::ItemFlags MyStandardItemModel::flags(const QModelIndex& index) const
{
    if (index.column() == TX_PACKET_COLUMN || index.column() == RX_PACKET_COLUMN)
    {
        return (QStandardItemModel::flags(index) & ~Qt::ItemIsEditable);
    }
    else
    {
        return QStandardItemModel::flags(index);
    }
}

...

//Set model
ui->testCaseTableView->setModel(model);

これを行うと、3 列目と 4 列目のセルを編集できなくなります。

ここで、これらのセルをダブルクリックすると、ポップアップ ダイアログが表示されるようにします。そのダイアログの編集可能なフィールドでいくつかのデータを変更し、それをコード内の編集不可能なセルにコピーして戻します。

QTreeView の doubleclick() ハンドラーを作成し、一部のデータをセルにコピーして、編集不可能なセルにデータをコピーできるかどうかを確認しようとしました。

この操作は失敗し、データは編集不可のセルに書き込まれません。

ここでは、ダブルクリック ハンドラーを見つけることができます。

void MainWindow::on_testCaseTableView_doubleClicked(const QModelIndex &index)
{
    QVariant variant;
    variant.toString() = "AA";

    if((index.column() == TX_PACKET_COLUMN)||(index.column() == RX_PACKET_COLUMN))
    {
        model->setData(index, variant);   // set new value
    }

}

setData(..) 操作は、セルに既に書き込まれているデータをクリアしていますが、文字列 "AA" は書き込まれていません。コード内の編集不可能なセルにデータをコピーする方法を提案してください。

ここに画像の説明を入力

4

2 に答える 2

1

コメントで示したように、この最初の問題を修正する必要があります。

それ以外の:

QVariant variant;
variant.toString() = "AA";

あなたは書くべきです

QVariant variant = QLatin1String("AA");

一般的には、setData(...) の実装でデータ変更シグナルを適切に発行するかどうかなどを調べますが、ここでは、問題につながる可能性のある以前の問題を入力しているので、それを修正しましょう。

生の char* から QString への不必要な明示的な変換を避けるために、QLatin1String を使用する必要があることに注意してください。これは一般的に良い方法であり、Qt 4 と Qt 5 で利用できます。

ただし、QStringLiteral マクロを使用して、生のリテラルからテンプレート マジックを使用して非常に効率的に QString を作成することもできますが、それには C++11 が必要です。

于 2013-09-28T10:12:57.947 に答える