2012-11-02 3 views
0

모두이 문제를 해결하는 좋은 방법을 결정하는 데 문제가 있습니다. 데이터 모델은 MyData입니다. 내 데이터를 QObject으로 모델링 했으므로 신호와 슬롯이 있습니다.두 가지 다른보기를 가진 Qt 데이터 모델

모델의 데이터를 수정하려면 해당 슬롯에 연결하거나 슬롯을 직접 호출 할 수 있습니다. 수정이 발생하면 모델은 데이터가 변경되었음을 알립니다. 예를 들면 : 나는 점을 목록에 QAbstractItemModel를 사용하는 QListViewQGraphicsEllipseItem

  • 사용하여 포인트를 나타내는 QGraphicsView

    1. :
      class MyData : public QObject 
      { 
          ... 
      public slots: 
          void AddPoint(QPointF); 
      
      signals: 
          void AddedPoint(QPointF); 
      }; 
      
      void MyData::AddPoint(QPointF p) 
      { 
          //added the point 
          emit AddedPoint(p); 
      } 
      

      지금 내 의견은 두 개의 별도 것들입니다.

    신호와 슬롯을 사용하여이 두 그래픽 뷰를 동기화합니다 (QObject에서 상속하기 위해 QGraphicsItem을 하위 클래스로 사용합니다).

    질문

    : 테이블을 변경하는, 그 회전 신호를 QGraphicsView AddedPoint에 접속된다 MyData를 신호. 그러나, MyData::AddedPoint도 테이블에 연결되므로 동기화를 시도 할 때 두 개의 동일한 점이 추가됩니다. 누구든지 진행 방법에 대한 조언을 해 줄 수 있습니까?


    내 생각과 아이디어 지금까지 :

    • 나는 지점이 존재하는지 확인하고, 반복을 방지 할 수있다. 삽입 작업에 효과적이며 삭제 및 업데이트에 적합하지 않습니다.
    • 가장 좋은 접근 방법은 다음과 같습니다.MyData 슬롯에서 보낸 사람()을 잠시 차단하고 차단을 해제하십시오.

    편집 :MyData 정말 "컨트롤러/인터페이스"클래스, 실제 모델은 OpenCV의 유형을 사용하고, 따라서 나는 그것이 Qt는 아키텍처에서 분리 유지하고 싶습니다.

  • +0

    Qt 프록시 모델을 보았습니까? – hyde

    답변

    3

    이 같은 QAbstractListModel에서 파생 수 :

    class MyData : public QAbstractListModel 
    { 
        Q_OBJECT 
    public: 
        enum CustomRoles { 
         PositionRole = Qt::UserRole + 1, 
         BoundingRectRole 
        }; 
        MyData(QObject *parent = 0) : QAbstractListModel(parent) 
        { 
         QHash<int, QByteArray> roles; 
         roles[PositionRole] = "Position"; 
         roles[BoundingRectRole] = "BoundingRect"; 
         setRoleNames(roles); 
        } 
        int rowCount(const QModelIndex & parent = QModelIndex()) const 
        { 
         return points.count(); 
        } 
    
        QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const 
        { 
         if (index.row() < 0 || index.row() > points.count()) 
          return QVariant(); 
    
         const QGraphicsEllipseItem &p = points[index.row()]; 
         QVariant actualData; 
         if (role == Qt::DisplayRole) 
          actualData = "some point"; 
         else if (role == PositionRole) 
          actualData = p.scenePos(); 
         else if (role == BoundingRectRole) 
          actualData = p.boundingRect(); 
    
         return actualData; 
        } 
    
    public slots: 
        void addPoint(int x, int y) 
        { 
         beginInsertRows(QModelIndex(), rowCount(), rowCount()); 
         QGraphicsEllipseItem *it = new QGraphicsEllipseItem(0,0, 5, 5); 
         it->setPos(x,y); 
         points << it; 
         endInsertRows(); 
        } 
    
    private: 
        QVector<QGraphicsEllipseItem*> points; 
    }; 
    

    지금 당신은 단순히 rowsInserted(...) 및/또는 모델의 rowsRemoved(...) 신호에 연결하여 QListView에와 QGraphicsScene에서이 모델을 추가 할 수 있습니다.

    도 읽을 수 있습니다. this

    +0

    읽어 주셔서 감사합니다, 바로 입수 할게요! – Constantin

    +0

    이것은 매우 도움이되었는데, 비슷한 접근 방식을 취했습니다. – Constantin

    관련 문제