具有两种不同视图的 Qt 数据模型
Posted
技术标签:
【中文标题】具有两种不同视图的 Qt 数据模型【英文标题】:Qt Data Model With Two Different Views 【发布时间】:2012-11-02 17:58:26 【问题描述】:所有,我无法确定处理此问题的好方法。我有一个数据模型,我们称之为MyData
。我已将我的数据建模为 QObject
,因此它具有信号和插槽。
要修改模型中的任何数据,您可以连接到其插槽,或直接调用插槽。当该修改发生时,模型会发出信号表明其数据已更改。例如:
class MyData : public QObject
...
public slots:
void AddPoint(QPointF);
signals:
void AddedPoint(QPointF);
;
void MyData::AddPoint(QPointF p)
//added the point
emit AddedPoint(p);
现在我的观点是两个不同的东西:
-
我有一个
QGraphicsView
,它表示使用QGraphicsEllipseItem
的点
我有一个QListView
,它使用QAbstractItemModel
列出积分。
我使用信号和槽同步这两个图形视图(我将 QGraphicsItem 子类化为从 QObject 继承)。
问题:当表格进行更改时,它会向MyData
发出信号,而AddedPoint
又会向连接到QGraphicsView 的AddedPoint
发出信号。 但是,MyData::AddedPoint
也连接到表,因此在尝试同步时会添加两个相同的点。任何人都可以提供有关如何进行的任何建议吗?
到目前为止我的想法和想法:
我可以检查该点是否存在,并防止重复。非常适合插入,但不适合删除和更新。 我认为最好的方法是:在MyData
插槽中,阻止 sender() 一秒钟,然后取消阻止。
编辑:MyData
确实是一个“控制器/接口”类,真实模型使用 OpenCV 类型,因此我希望将其与 Qt 架构分开。
【问题讨论】:
你看过 Qt 代理模型吗? 【参考方案1】:您可以像这样从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
【讨论】:
这很有帮助,我采用了非常相似的方法。以上是关于具有两种不同视图的 Qt 数据模型的主要内容,如果未能解决你的问题,请参考以下文章