2012-11-02 54 views
0

一切,我無法確定來處理這一個很好的方式。我有一個數據模型,我們將其稱爲MyData。我有我的模擬數據作爲QObject,因而它具有信號和槽。Qt的數據模型的兩種不同的觀點

要修改模型中的任何數據,您可以連接到它的插槽,或直接致電插槽。當修改發生時,模型表示其數據已更改。例如:

class MyData : public QObject 
{ 
    ... 
public slots: 
    void AddPoint(QPointF); 

signals: 
    void AddedPoint(QPointF); 
}; 

void MyData::AddPoint(QPointF p) 
{ 
    //added the point 
    emit AddedPoint(p); 
} 

現在,我的看法是兩個不同的東西:

  1. 我有一個QGraphicsView代表使用QGraphicsEllipseItem
  2. 我有一個QListView它採用了QAbstractItemModel列出分點。

我使用信號和插槽同步這兩個圖形視圖(我從QObject繼承QGraphicsItem的子類)。

的問題:當表使得變化,它標誌着MyData,這反過來信號AddedPoint其被連接到所述的QGraphicsView。 然而MyData::AddedPoint也被連接到該表中,並且當它試圖同步相加從而兩個相同的點。任何人都可以就如何繼續提供任何建議嗎?


我的想法和意見,到目前爲止:

  • 我可以檢查點存在,並且防止重複。非常適合插入,對於刪除和更新並不太好。
  • 我認爲最好的方法是:MyData插槽中,阻塞sender()一秒,然後解鎖。

編輯: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; 
}; 

現在可以將這個模型只是添加到您而QListView並在QGraphicsScene連接到rowsInserted(...)和/或模型的rowsRemoved(...)信號。

我也可以推薦閱讀this

+0

感謝您的閱讀,我會馬上就可以了! – Constantin

+0

這非常有幫助,我採取了非常類似的方法。 – Constantin

相關問題