如何使QTableView类中的restoreState()和saveState()函数正常工作?

6
首先,我想说一下,我的问题已经在SO上讨论过了,链接在这里:https://dev59.com/gUjSa4cB1Zd3GeqPGImn。但是那些答案并不好用...
所以,这就是问题:我有一个QTableView类,其中包含一个简单的model,通过tableView->setModel(model)方法连接。例如,我有4-5列。我启动了我的项目应用程序,并对列宽进行了一些更改。之后我按了退出键,我的项目应用程序使用QSettings将tableView->horizontalHeader()->saveState()数据保存到文件中。当我再次启动应用程序时,它会做出以下操作:
tableView->horizontalHeader()->restoreState(/* data from settings ini file */);

但是,什么都没有发生!列的宽度具有标准宽度。它们没有根据我的存储值进行更改! :(

谢谢!


PS:这个问题在 QTreeView 类中并不明显。在 QTreeView 中一切正常!


restoreState() 返回 true 或 false 来指示是否成功。你的返回 true 吗? - Arnold Spence
@Arnold Spence,对于我所有的QTableViewQTreeView,在执行restoreState()时,我得到了true值... - mosg
在您的启动程序中,您何时调用restoreState()函数?一些简要的搜索似乎表明,您应该等到应用程序完成启动和初始化所有内容之后才会调用该函数。作为一个实验,您可以尝试向应用程序添加一个按钮或菜单,在其运行后调用恢复函数并查看其是否有效。 - Arnold Spence
@Arnold Hm,我仍然认为这只是QTableView基类的问题 - Qt的一个bug。因为我尝试使用简单的Qt演示示例(带有QTableViews)恢复状态,但仍然没有成功。我不想在我的项目中添加额外的代码,因为我认为基本的Qt功能(保存/恢复标题状态)必须正常工作!但我会再尝试一个例子,即在程序运行时从内存中保存/恢复标题设置.. - mosg
内存 saveState/restoreState 方法已经可行! - mosg
很好。那么你的代码在使用QSettings进行文件持久化时出了问题? - Arnold Spence
1个回答

10

我尝试重现你的问题,但是对我来说一切都正常。这是我所做的:

使用Qt Designer,在我的表单上放置了一个名为tbvTestQTableView

在我的表单构造函数中,我写下了以下代码:

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->tbvTest->setModel(new TableModel);

    QSettings MySetting(QSettings::IniFormat, QSettings::UserScope, "Test");
    QByteArray MyArray = MySetting.value("column_width", "").toByteArray();
    ui->tbvTest->horizontalHeader()->restoreState(MyArray);
}

(请注意,在我的main.cpp中,我设置了ApplicationNameOrganizationNameOrganizationDomain)。
在我的窗体析构函数中,以下是我编写的内容:
Widget::~Widget()
{
    QByteArray MyArray = ui->tbvTest->horizontalHeader()->saveState();
    QSettings MySetting(QSettings::IniFormat, QSettings::UserScope, "Test");
    MySetting.setValue("column_width", MyArray);

    delete ui;
}

如果我运行应用程序并更改列宽度,然后退出应用程序并再次运行它,那么列宽度将被正确恢复。

我和你做的事情有什么不同吗?


感谢您的出色回答,我会尽快尝试您的示例。我做了所有相同的事情,但有点复杂。在我获得成功的结果后,我会在这里提到它! - mosg
回答问题了,因为我承诺过! %) - mosg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接