2012-04-15 6 views
2

ソフトウェアのレイヤーを管理するためのレイヤーの選択と表示のために、PhotoshopのようなGUIを作成したいと考えています。基本的には、ListViewのようなものを、QListWidgetItemにレイヤーのテキストと可視性のチェックボックスを付けたいと思っています。Qtのレイヤマネージャー

まず、QListWidgetQListWidgetItemとするのは、項目のフラグをUserCheckableにすることで簡単にできたようでした。それはある程度は機能しますが、可視性を変更する前に「レイヤー」を選択する必要があります。

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

私はQGraphicsViewQGraphicsItemとすることを検討していますが、これを実装することができないかどうか本当に知りたいと思います。

答えて

1

QListWidgetは、クリックされた項目の境界矩形を決定し、そのチェックボックスのみを選択する場合でも、itemAt()を使用して選択します。このメソッドは仮想ではないので、汚れたトリックを使わずにその動作を変更することはできません(チェックボックスを切り替えるたびに選択を変更するなど)。独自のQListViewとQAbstractItemModel(QListWidgetと同様)を派生させる必要があります。心配しないでください、othersは、いくつか不自然なチェック/選択動作に気付きました。

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のモデル - ビュー - デリゲートアーキテクチャはのため多少怖いです知っています訓練されていないプログラマーであったが、かつてはその楽しさを理解していた。ああ、私は個人的に手織りのQGraphicsViewソリューションを使用することを控えています。独自のトラップとコーナーがあり、許容できる形にするために時間がかかることがあります。

Good Luck!

+0

私は別々の列を使用することを考えていましたが、どのように使用するかを完全に決めることはできませんでした。今私は向きを整える方向がある。あなたの助けをありがとう! – Rikonator