0

QAbstractItemModel をサブクラス化し、dataChanged シグナルのスロットでウィジェットを取得しようとしています。

connect(model, SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(slotDataChanged(const QModelIndex&, const QModelIndex&)));

void MyEditor::slotDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight)
{
    QComboBox* widget = dynamic_cast<QComboBox*>(sender());
    if (widget)
    {
         // do something
    }
}

ここでは、毎回 null ウィジェットを取得していますが、qobject_cast と同じ結果です。

テーブルビューでQStyledItemDelegateを派生させるデリゲートクラスにコンボボックスウィジェットを設定しています。

MyDelegate* myDelegate;
myDelegate = new MyDelegate();
tableView->setItemDelegate(myDelegate);
tableView->setModel(model);


 QWidget* MyDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
 {
      QComboBox* cb = new QComboBox(parent);
      cb->addItem(QString("All"));
      cb->setCurrentIndex(0);
      return cb;
 }

この場合、送信者オブジェクトを取得するにはどうすればよいですか? ありがとう。

4

2 に答える 2

1

あなたの意図が何であるかわからない。モデル内のデータが既に更新されている場合、エディター ウィジェットを取得することは通常は不要です。Model-View-Delegate問題を解決するには、概念の簡単な紹介が必要なようです。

要するに、あなたの場合は であるビューには、QTableViewそれ自体にはデータがありません。ビューはメソッドを呼び出してアタッチされたモデルからデータを取得しますdata。ユーザーがデータを編集しようとすると、デリゲートcreateEditorsetEditorDataメソッドが呼び出されます。後者は引数の 1 つとしてモデル ポインターを持っているため、表現する必要がある実際のデータにアクセスできます。

ユーザーが編集を終了setModelDataすると、更新された値を取得するために使用できるエディター ウィジェットを持つ が呼び出されます。setDataまた、メソッドを介して通常行われる適切なデータ入力を変更するために利用できるモデルもあります。この時点で、対応するデータが更新されたことをビューに通知する dataChanged シグナルが発行され、表示された値を更新できるようになります。

したがって、設計を再考してみてください。おそらく、達成したいことを別の方法で実装したり、記述されたフローに適合するように実装をわずかに変更したりできます。

Star Delegate Exampleの Qt サイトをチェックして、いくつかのサンプル実装を確認したり、モデル ビュー トピックのより広範な説明についてモデル ビュー チュートリアルを確認したりすることもできます。

于 2016-11-22T22:11:43.767 に答える