QT 排序模型并在表视图中显示



我必须为模型(现在它使用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;

最新更新