【发布时间】:2016-03-30 09:22:34
【问题描述】:
我必须为模型(现在它使用MyTableItem 列表)和标题(处理点击列)创建自己的表格视图(实现拖动)类
查看:
class DragTableView : public QTableView
{
public:
DragTableView(QWidget *parent = 0);
void Initialzie(Overseer *Overseer);
protected:
void mouseMoveEvent(QMouseEvent *event);
private:
void performDrag();
};
标题:
class ClickableHeaderView : public QHeaderView
{
Q_OBJECT
public:
ClickableHeaderView(ObjectMaster* Master);
~ClickableHeaderView(){};
public slots:
void sectionClicked(int index);
};
型号:
class CustomModelOfCustomObjects : public QAbstractTableModel
{
Q_OBJECT
public:
CustomModelOfCustomObjects();
//(...)
///SOME FUNCTIONS LIKE ADDING ITEM, REMOVING IT, ETC
int rowCount(const QModelIndex &parent) const;
int columnCount(const QModelIndex &parent) const;
QVariant data(const QModelIndex &index, int role) const;
bool insertRows(int position, int rows, const QModelIndex &index);
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
private:
QList <MyTableItem> listOfObjects;
};
MyTableItem 只是一个包含一些 QString 和表示数据的 int 的类。
我处理鼠标单击确定,将信息进一步传递给我的Overseer 类,该类存储模型(并将指向它的指针指向表格视图)并设法用这个 k 对其进行排序记住,这个函数是模型的函数):
//Example for sorting by "Name"
void sortItemsBy_Name()
{
qSort(listOfObjects.begin(), listOfObjects.end(), compare_Names);
}
bool compare_Names(MyTableItem &v1, MyTableItem &v2)
{
int result = QString::localeAwareCompare(v1.get_Name() , v2.get_Name());
if(result >0)
return true;
else
return false;
}
到目前为止一切都很好。列表排序正确,但显示的内容 - 不是。我尝试使用:
emit dataChanged(QModelIndex(), QModelIndex());
它刷新了TableView 的显示,但每个元素都在错误的位置,而在列表中 - 一切都很好(我在调试中检查过)。
编辑 1: Sorting Qt Table Model - QTableView doesn't get updated 中提出的解决方案没有奏效。
编辑 2:
我注意到我的表格视图看起来完全一样 - 如果我使用 layoutAboutToBeChanged / dataChanged / NOTHING。
【问题讨论】:
-
我认为你必须发出 QAbstractItemModel::layoutAboutToBeChanged() 和 QAbstractItemModel::layoutChanged() 而不是 dataChanged()
-
我也试过了——同样的结果。编辑:根据此页面(doc.qt.io/qt-4.8/qabstractitemmodel.html)“例如,只要模型提供的数据项发生更改,就会发出 dataChanged()。对模型提供的标头的更改会导致发出 headerDataChanged()。如果如果底层数据结构发生变化,模型可以发出 layoutChanged() 来向任何附加视图指示它们应该重新显示显示的任何项目,同时考虑到新结构。”
-
我同意 dupliacte,但我先尝试了该主题,但没有帮助。
-
你说“每个元素都在错误的位置”。你的意思是当你更新表格时他们的位置发生了变化?您可以添加此更新的代码吗?