2012-04-15 2 views
2

내 소프트웨어의 레이어를 관리하기 위해 레이어 선택 및 가시성을위한 GUI와 같은 Photoshop을 만들고 싶습니다. 기본적으로, ListView과 같은 것을 가지고 싶습니다. QListWidgetItem에는 레이어의 텍스트와 가시성을위한 체크 상자가 있습니다.Qt의 레이어 관리자

처음에는 QListWidgetQListWidgetItem을 사용하여 항목의 플래그를 설정하여 UserCheckable로 설정하는 것이 쉬운 것처럼 보였습니다. 어느 정도까지는 작동하지만 가시성을 변경하기 전에 '레이어'를 선택해야합니다.

QListWidgetItem을 구현하여 항목을 선택하지 않고도 확인란을 선택/선택 취소 할 수 있습니까? 또는 레이어 관리자를 구현하기 위해 다른 방법을 사용해야합니까?

저는 QGraphicsViewQGraphicsItem으로 생각하고 있습니다. 그러나 이것을 구현할 수 있는지 알고 싶습니다.

답변

1

QListWidget은 을 사용하여 클릭 한 항목 경계 사각형을 결정하고 선택 상자가있는 경우에도 선택합니다. 이 메서드는 가상 메서드가 아니기 때문에 더러운 트릭 (체크 상자를 전환 할 때마다 선택 항목을 변경하는 등)없이 해당 동작을 변경할 수 없습니다. QListWidget과 마찬가지로 자신 만의 QListView 및 QAbstractItemModel을 파생시켜야합니다. 걱정하지 마십시오. others은 부적절한 체크/선택 동작을 발견했습니다. 어떤 방향으로 알려 드리겠습니다.

두 개의 열이있는 고유 한 QAbstractItemModel을 파생시켜야합니다. 첫 번째 열은 확인란 열이며 확인란 항목을 그리는 열 위임자를 지정해야하며 두 번째 열은 표시 텍스트 열입니다 (아래에서 다루지 않음). 그런 다음 YourListView 클래스 : 나는 Qt의 모델 - 뷰 - 대리인 아키텍처는 다소 무서운 알고

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); 
      } 
     } 
} 

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

을 선포/사용

자신의 슬롯으로 클릭 신호를 연결합니다 훈련받지 않은 프로그래머 였지만 그 재미를 한 번 이해했다. 아, 개인적으로 손으로 짠 QGraphicsView 솔루션을 사용하지 않으려합니다. 자체 트랩 및 모서리가있어 허용되는 모양으로 전환하는 데 더 많은 시간을 들여야합니다.

행운을 빌어 요!

+0

별도의 열을 사용한다고 생각했지만 사용법을 완전히 결정할 수는 없었습니다. 이제 나는 정해야 할 방향이 있습니다. 도와 주셔서 정말로 고맙습니다! – Rikonator