1

QAbstractItemDelegate (独自の Item デリゲート クラス) で paint() 関数をオーバーロードしています。

ドラッグすると、セル全体の内容がペイントされますが、これは望ましくありません。ドラッグ中に特定の何かで paint() 関数が呼び出されると想定していますが、それが見つからないようです。

私が見つけることができた最も近いものは、所有するビュークラスの QState 変数です (アクセス関数 QTableView::state() は保護されています)関数を呼び出して、ドラッグしているかどうかを返します。デリゲート クラス内で、ドラッグしているかどうかを判断し、paint() 関数を変更できます。

これはほとんど機能します。

問題は、元のセルに変更されたペイント イメージが表示されることです。これは望ましくありません。元のセルのイメージをそのままにしておきたいのです。

例を精査して、これを行う何かがあるかどうかを確認する必要があると思います...

Qt ソースをクロールして、QItemDelegate::paint() 関数を呼び出してドラッグ ピックスマップを設定する場所を確認できますが、変更されるのは、項目オプション スタイルで QStyle::State_Selected を強制することだけです。アイテムはすでに選択されているので、それだけでは不十分です。

ドラッグ時にセルの内容を明示的に描画する方法を知る方法はありますか?

4

2 に答える 2

2

わかりました、これに関する最終的な答えは、はい、「startDrag」にフラグを設定することでしたが、そのままにしてマウスリリースボタンイベントで設定を解除するのではなく、基本メソッドを呼び出してから設定を解除します。

その理由は、最初に考えたように、ドラッグ中に継続的にではなく、カーソルのイメージが 1 回だけ要求 (および描画) されるためです。フラグを設定したままにしておくと、カーソル イメージが不適切なタイミングで描画されることになります。

したがって、実装は次のようになります。

MyClass::dragStart(Qt::DropActions supportedActions)
{
  __dragStart = true;
  TableView::dragStart(supportedActions);
                   // request for drag cursor image happens here
  __dragStart = false;
}
于 2011-03-28T14:36:02.583 に答える
0

自分でやってみませんか?ドラッグの開始時にフラグを設定し、アクティブなModelIndexを記憶し、フラグが設定されたときに特別なペイントを行い、ドラッグが終了したときにフラグをクリアします。これを行うには、QAbstractItemView::startDragをオーバーライドします。

于 2011-03-25T07:07:00.220 に答える