如何在Qt中保存对话框的状态?

7
假设对话框中有多选框、选项等控件,我该如何在Qt中保存对话框的状态呢?是否应该使用QSettings或其他什么东西?谢谢。
2个回答

10

我遇到了同样的问题。 谷歌搜索也没有太大的帮助。 因此最终我自己编写了解决方案。

我创建了一组函数,用于在对话框创建和销毁时读取和写入每个子控件的状态。 它是通用的,并可用于任何对话框。

它的工作方式如下:

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    QMoMSettings::readSettings(this);
}

Dialog::~Dialog()
{
    QMoMSettings::writeSettings(this);
    delete ui;
}

...

void QMoMSettings::readSettings(QWidget* window)
{
    QSettings settings;

    settings.beginGroup(window->objectName());
    QVariant value = settings.value("pos");
    if (!value.isNull())
    {
        window->move(settings.value("pos").toPoint());
        window->resize(settings.value("size").toSize());
        recurseRead(settings, window);
    }
    settings.endGroup();
}

void QMoMSettings::writeSettings(QWidget* window)
{
    QSettings settings;

    settings.beginGroup(window->objectName());
    settings.setValue("pos", window->pos());
    settings.setValue("size", window->size());
    recurseWrite(settings, window);
    settings.endGroup();
}

void QMoMSettings::recurseRead(QSettings& settings, QObject* object)
{
    QCheckBox* checkbox = dynamic_cast<QCheckBox*>(object);
    if (0 != checkbox)
    {
        checkbox->setChecked(settings.value(checkbox->objectName()).toBool());
    }
    QComboBox* combobox = dynamic_cast<QComboBox*>(object);
    if (0 != combobox)
    {
        combobox->setCurrentIndex(settings.value(combobox->objectName()).toInt());
    }
    ...

    foreach(QObject* child, object->children())
    {
        recurseRead(settings, child);
    }
}

void QMoMSettings::recurseWrite(QSettings& settings, QObject* object)
{
    QCheckBox* checkbox = dynamic_cast<QCheckBox*>(object);
    if (0 != checkbox)
    {
        settings.setValue(checkbox->objectName(), checkbox->isChecked());
    }
    QComboBox* combobox = dynamic_cast<QComboBox*>(object);
    if (0 != combobox)
    {
        settings.setValue(combobox->objectName(), combobox->currentIndex());
    }
    ...

    foreach(QObject* child, object->children())
    {
        recurseWrite(settings, child);
    }
}

希望这篇文章对后来者有所帮助。

2

QSettings可以满足你的需求,但本质上只是对选项进行序列化,并在启动时重新加载它们,因此有很多关于在Qt中执行此操作的文档。


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