从QHeaderView saveState / restoreState中排除已移动的列顺序

时间:2014-10-16 09:41:19

标签: qt savestate qheaderview

我遇到了 QHeaderView 的saveState / restoreState问题。我的应用程序中有几个 QTableViews 。 QTableView保存并恢复了它的QHeaderView设置,但是对于某些QTableViews,我想将保存的部分顺序从保存到ini文件中排除。

这意味着, saveState 应该保存已排序的列,排序指示符,列宽,但如果用户移动了列则不能。

有没有办法不保存已移动的列?

谢谢。

此致 摩尼

1 个答案:

答案 0 :(得分:0)

没有简单的方法可以做到这一点。我建议下一个:

使用向量存储已移动标题的logicalIndexes

QVector<int> last;

使用sectionMoved信号检测向量中的移动和存储logicalIndex

connect( ui->tableView->horizontalHeader(),static_cast<void (QHeaderView::*)(int,int,int)>(&QHeaderView::sectionMoved),[=](int logicalIndex, int oldVisualIndex, int newVisualIndex)
{//with lambda
    //you can also provide shecking is current logicalIdnex already exist in vector
    last.push_back(logicalIndex);
 });

语法非常复杂和丑陋,因为sectionMoved中还有另一个QHeaderView,所以这是必要的。如果您不了解新语法,请使用旧语句:

connect( ui->tableView->horizontalHeader(), SIGNAL(sectionMoved(int,int,int)), this, SLOT(yourSlot(int,int,int)));

但请在此广告位中创建yourSlot(int,int,int)并执行last.push_back(logicalIndex);

如果您需要saveState,请隐藏存储在向量中的logicalIndex所有部分并保存:

QByteArray array;
for(int i = 0; i < last.size(); i++)
{
    ui->tableView->horizontalHeader()->hideSection(last.at(i));
}
array = ui->tableView->horizontalHeader()->saveState();

如果要使用新语法和lambda,请将CONFIG += c++11添加到专业文件。