Qt Dungeons:モンスタークッキングレシピ(パート1.異種データの編集)

画像



Qtを使用するすべてのプロのアプリケーション開発者は、さまざまなデータ操作にモデル/デリゲート/ビューリンクを使用する必要が非常に頻繁にあります。 このテンプレートの主な詳細は、このトピックの標準マニュアルで詳しく説明されていますが、特定のニーズに合わせて標準の動作を拡張または補足する必要がある状況に対処する必要があることがよくあります。 通常、ここで私たち全員がプログラミングを愛するもの、つまりお気に入りのスクーターや人力車に乗るということから始まります。 その瞬間、内なる声が私たちを止めるはずでしたが、私たちは巧妙に反論しました。 そして最も重要なことは、どこから探し始めるかが明確ではないことです。」 そのため、自尊心のある開発者は、自分で厳選してテストしたレシピを手元に用意し、コレクションを補充する必要があります。



問題の声明



QAbstractTableModelに基づく単純な異種データエディターのドラフトを作成し、カスタムevilTypeタイプを追加しましょう(はい、このタイプには追加のトリックが必要です)。



通常、このタスクには2つのソリューションがあります。



  1. QAbstractItemDelegateまたはその派生物のcreateEditor関数をオーバーライドします
  2. カスタムタイプのカスタムエディターを追加し、エディターの標準ファクトリーQDefaultItemEditorFactoryをオーバーライドします。


最初のアプローチの欠点は、複数のタイプとそれらへのデリゲートがあり、原則として多かれ少なかれ複雑なプログラムの場合、さまざまなデリゲートのcreateEditorコードを複製する必要があることです。



2番目のアプローチの欠点-エディターの標準ファクトリーを再定義すると、ファクトリーQDefaultItemEditorFactoryが失われるため、ファクトリーに標準エディターを再登録する必要があります。



スクーター



標準ファクトリーを含み、カスタムタイプのcreateEditorをオーバーライドするハイブリッドクラス。



コード
void overrideEditorFactory(void) { class OverridenEditorFactory : public QItemEditorFactory { public: explicit OverridenEditorFactory(const QItemEditorFactory* dFactory) : _dFactory(dFactory) { auto creator = new QStandardItemEditorCreator<EvilTypeEditor>(); const auto evilTypeID = QVariant::fromValue(evilType()).userType(); registerEditor(evilTypeID, creator); } QWidget* createEditor(int userType, QWidget *parent) const { const auto evilTypeID = QVariant::fromValue(evilType()).userType(); if(evilTypeID == userType) { return QItemEditorFactory::createEditor(userType, parent); } return _dFactory->createEditor(userType, parent); } private: const QItemEditorFactory* _dFactory; }; QItemEditorFactory::setDefaultFactory(new OverridenEditorFactory(QItemEditorFactory::defaultFactory())); }
      
      







したがって、使用する前に、標準ファクトリをオーバーライドする関数を呼び出す必要があります。 そして今、カスタムタイプは私たちの希望に応じてどこでも編集されます。



おわりに



コードは主に説明のため、いくつかの点を改善できます。 ただし、主なアプローチ-コードミニマリズムと、さまざまなデリゲートを使用する場合の多くのディスプレイへのスケーリングの容易さは維持されます。



githubの完全なプロジェクトコード。



All Articles