Могу ли я получить все существующие переменные и сохранить их в QSettings в qt? - PullRequest
0 голосов
/ 08 сентября 2011

Мне нужно изменить источники 10 программ таким образом, чтобы я мог выйти из них в любое время, используя большую красную кнопку, а затем, после перезапуска, работать с того же места, которое я остановил.Есть ли способ получения всех существующих переменных?

Ответы [ 4 ]

1 голос
/ 08 сентября 2011

Нет волшебной палочки, которая будет делать то, что вам нужно.В частности, при перезагрузке программы все указатели из предыдущего запуска будут недействительными.И вы не можете обойти это, сохранив дамп памяти, потому что сама программа, вероятно, будет загружена по другому адресу.Вы должны включить в работу явное сохранение и восстановление всех соответствующих структур данных.

0 голосов
/ 02 декабря 2012
  1. Решением будет использование Сеансов
  2. Другим решением будет использование QSettings
  3. И третье решение будет использовать Сериализация
0 голосов
/ 11 сентября 2011

Как объяснено в других ответах, в C ++ просто нет механизма, который мог бы в общих чертах иметь дело с сериализацией и десериализацией состояний / переменных вашей программы.Все методы будут включать рукописный код, чтобы явно иметь дело с такой функциональностью.

В частности, о QSettings, вы можете, например, добавить 2 метода в ваш QMainWindow (при условии, что вы используете один, если нет, то какой бы класс ни был тем, которыйимеет доступ к необходимым состояниям вашей программы), которые сохраняют и восстанавливают состояния с помощью объекта QSettings.

Что-то вроде:

void MainWindow::saveStateToSettings() // QMainWindow already has method saveState() to store dockwidgets and toolbars locations and visibility, so don't use that function name for this
{
  QSettings settings; // the QSettings default constructor can be made to have default parameters like shown in the main() function code below
  settings.setValue("mywindowgeometry",saveGeometry()); // QWidget::saveGeometry is the recommended way to serialize the position, size and monitor number etc of QWidget
  settings.setValue("myvariable1",m_myVariable1); // m_myVariable1 could be any of various basic C++ or Qt value datatypes, like int, float, QString, QRect, QByteArray etc, let's assume here it is a double floating point number. DON'T store pointers using this, serializing pointers is almost always useless and/or dangerous
  settings.setValue("checkbox1checked",ui->checkBox->isChecked()); // store a bool
  settings.setValue("plaintextedit1text",ui->plainTextEdit->toPlainText()); // store a QString
  // write similar code as above to save all other needed state
  // that's all there is to it to save the state!
}

void MainWindow::loadStateFromSettings()
{
  QSettings settings;
  restoreGeometry(settings.value("mywindowgeometry").toByteArray()); // QWidget::restoreGeometry restores the widget geometry from data that was generated previously with QWidget::saveGeometry
  m_myVariable1=settings.value("myvariable1",0.5).toDouble(); // the 0.5 sets a default value if the QSettings instance is missing the variable or there's some other problem with the QSettings instance
  ui->checkBox->setChecked(settings.value("checkbox1checked",true).toBool()); // again, the "true" value will be used in case of problem with QSettings
  ui->plainTextEdit->setPlainText(settings.value("plaintextedit1text").toString()); // no value as the default value "magically" gives an empty QString
}

Обратите внимание, что для правильной работы restoreGeometry, loadStateFromSettings() вызов должен быть сделан после создания виджета, не вызывайте его в самом конструкторе класса виджета.Ваша функция main () может выглядеть примерно так:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QSettings::setDefaultFormat(QSettings::IniFormat); // now QSettings default constructor anywhere in the program code creates a QSettings object that uses ini-files. Note that on Windows you could use the registry and on Mac plist-files. Read the QSettings documentation for more on this
    QApplication::setApplicationName("MyApplication"); // you should set this for your app object so QSettings can store the settings for your app in a location that can be identified by that name
    QApplication::setOrganizationName("MyName"); // you should set this for your app object, the organization name is effectively your "company" name, and it makes QSettings store the settings for your app(s) in a location that can be identified by that name
    MainWindow w;
    w.loadStateFromSettings();
    w.show();
    return a.exec();
}

Я набрал это в основном из памяти, поэтому код не гарантированно компилируется и работает напрямую, но, надеюсь, это даст вам представление о том, как это сделать.об этом.

0 голосов
/ 08 сентября 2011

Вы можете посмотреть сериализацию переменных, а затем добавить дополнительную функцию при загрузке, чтобы проверить наличие файла и, если он существует, загрузку их обратно. Вы должны взглянуть на класс QDataStream и его функциональные возможности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...