Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使restoreState()和saveState()对QTableView类正确工作?_Qt_Save_Restore_Qtableview - Fatal编程技术网

如何使restoreState()和saveState()对QTableView类正确工作?

如何使restoreState()和saveState()对QTableView类正确工作?,qt,save,restore,qtableview,Qt,Save,Restore,Qtableview,首先,我想说,我的问题已经在这里讨论过了,等等。但答案不是好的 因此,这里是问题:我有一个QTableView类,有一个简单的模型,与tableView->setModel(model)连接方法。例如,我有4-5列。我启动了我的项目应用程序,并对列宽进行了一些更改。按下退出键后,我的项目应用程序保存了tableView->horizontalHeader()->saveState()的状态数据与QSettings一起归档。当我再次启动我的应用程序时,它会产生如下结果: tableView->

首先,我想说,我的问题已经在这里讨论过了,等等。但答案不是好的

因此,这里是问题:我有一个
QTableView
类,有一个简单的
模型
,与
tableView->setModel(model)连接方法。例如,我有4-5列。我启动了我的项目应用程序,并对列宽进行了一些更改。按下退出键后,我的项目应用程序保存了
tableView->horizontalHeader()->saveState()的状态数据与
QSettings
一起归档。当我再次启动我的应用程序时,它会产生如下结果:

tableView->horizontalHeader()->restoreState(/* data from settings ini file */);
但是,什么也没发生!列宽具有标准宽度。它们不会使用我的存储值进行更改!:(

谢谢



PS:QTreeView
QTreeView
类中的问题并不明显。使用
QTreeView
一切正常!

我试图重现您的问题,但一切都很好。以下是我所做的:

使用Qt Designer,我在表单上放置了一个
QTableView
(名为
tbvTest

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

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);
}
Widget::~Widget()
{
    QByteArray MyArray = ui->tbvTest->horizontalHeader()->saveState();
    QSettings MySetting(QSettings::IniFormat, QSettings::UserScope, "Test");
    MySetting.setValue("column_width", MyArray);

    delete ui;
}
(请注意,在my
main.cpp
中,我设置了,和)

在我表单的析构函数中,我写了以下内容:

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);
}
Widget::~Widget()
{
    QByteArray MyArray = ui->tbvTest->horizontalHeader()->saveState();
    QSettings MySetting(QSettings::IniFormat, QSettings::UserScope, "Test");
    MySetting.setValue("column_width", MyArray);

    delete ui;
}
如果我运行应用程序并更改列宽,退出应用程序并再次运行,列宽将正确恢复


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

restoreState()返回true或false以表明它是否成功。你的返回true吗?@Arnold Spence带着我所有的
QTableView
QTreeView
,我在执行restoreState()时得到了true值……在你启动时,你是在调用restoreState()吗?一些简短的搜索似乎建议您等待应用程序完成启动和初始化所有内容。作为一个实验,您可以尝试在应用程序运行后添加一个按钮或菜单来调用还原,看看是否有效。@Arnold Hm,我仍然认为这只是
QTableView
基类问题-Qt错误。因为,我试图用简单的Qt演示示例(使用qtableview)恢复状态,但仍然没有成功。我不想向我的项目中添加额外的代码,因为,我认为基本的Qt功能(保存/恢复头状态)必须正确工作!但我将尝试另一个示例,在程序运行时从内存中保存/还原头设置..内存保存状态/恢复状态方法有效!。感谢您的回答,我将尽快尝试您的示例。我做了所有相同的事情,但有点复杂。在获得成功结果后,我将在这里提到它!回答问题,因为我已经答应了!%)