【问题标题】:QT Sorting model and displaying in Table ViewQT排序模型并在表格视图中显示
【发布时间】: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,但我先尝试了该主题,但没有帮助。
  • 你说“每个元素都在错误的位置”。你的意思是当你更新表格时他们的位置发生了变化?您可以添加此更新的代码吗?

标签: c++ qt sorting tableview


【解决方案1】:

我解决了。结果证明强制repaint() 有效,但也不是最佳解决方案。我搜索了“以前的”功能,发现break;case 中的一个switch 中丢失了。

【讨论】:

    猜你喜欢
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多