2

ソフトウェアのレイヤーを管理するために、レイヤーの選択と可視性のために Photoshop のような GUI を作成したいと考えています。基本的に、レイヤーのテキストと可視性のためのチェックボックスをListView備えた のようなものが必要です。QListWidgetItem

最初は、項目のフラグを設定して UserCheckable にするのQListWidgetは簡単に思えました。QListWidgetItemある程度は機能しますが、可視性を変更する前に「レイヤー」を選択する必要があります。

QListWidgetItem を実装して、アイテムを選択せず​​にチェックボックスをオン/オフできるようにする方法はありますか? または、レイヤ マネージャを実装するために別の方法を試す必要がありますか?

と を使用することを検討していますがQGraphicsViewQGraphicsItemこれを使用せずに実装できるかどうかを知りたいです。

4

1 に答える 1

1

QListWidget はitemAt( )を使用して、クリックされた項目の境界を示す四角形を決定し、それを選択します (チェックボックスのみの場合でも)。このメソッドは仮想ではないため、汚いトリック (チェック ボックスが切り替えられるたびに選択を変更するなど) なしではその動作を変更することはできません。独自の QListView と QAbstractItemModel を派生させる必要があります (QListWidget のように)。心配しないでください。の人は、不都合なチェック/選択動作に気付きました。方向性を教えてください:

2 つの列を持つ独自の QAbstractItemModel を派生させる必要があります。最初の列はチェックボックス列で、チェックボックス項目を描画する列デリゲートを割り当てる必要があります。2 番目は表示テキスト列です (以下では説明しません)。次に、YourListView クラスで:

クリックされた信号を自分のスロットに接続します。

 connect( this, SIGNAL(clicked( const QModelIndex &  )), this, SLOT(clickedSlot( const QModelIndex &  )) );

と宣言/使用

 void YourListView::clickedSlot( const QModelIndex &index )
 {        
       if( index.isValid() )
       {
          // Checkbox toggle

          if( index.column() == 0 )
          {
             QVariant beforeValue = this->model()->data( index );

             this->model()->setData( index, QVariant::fromValue( ! beforeValue.toBool() ) );
          }
          else
          if( index.column() == 1 )
          {
             this->selectionModel()->select( index, QItemSelectionModel::Toggle );
          }
       }
 }

Qt の model-view-delegate アーキテクチャは、訓練を受けていないプログラマにとってはやや怖いものですが、一度その楽しさを理解しました。ああ、個人的には手織りの QGraphicsView ソリューションの使用を控えたいと思います。独自のトラップやコーナーがあり、許容できる形にするのにより多くの時間がかかる可能性があります。

幸運を!

于 2012-04-15T10:45:31.330 に答える