我必须为模型(现在它使用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 和整数。
我处理鼠标点击确定,将信息进一步传递给我的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:排序Qt表模型中提供的解决方案 - QTableView没有得到更新并没有解决问题。
编辑2:我注意到我的表视图看起来完全相同 - 如果我使用 layoutAboutToBeChanged
/dataChanged
/NOTHING。
我解决了。事实证明,强制repaint()
有效,但也不是最好的解决方案。我搜索了"以前的"函数,我注意到switch
的一个case
中缺少break;
。