Qt: C++: Восстановление геометрии всплывающего диалогового окна

Я пытаюсь сохранить геометрию всплывающего диалогового окна, а затем восстановить его всякий раз, когда я вызываю всплывающее диалоговое окно (пока приложение все еще работает).

Но я не мог понять.

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

Я пытаюсь использовать QcloseEvent, QSettings и restoreGeometry. Но что-то не так, помогите.

Вот MainWindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "ui_addmembersdialog.h"
#include "addmembersdialog.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    mpAddMembersDialog = new AddMembersDialog;
    connect(ui->testBtn,SIGNAL(clicked()),this,SLOT(openPopUpForm()));
}

void MainWindow::openPopUpForm(){
    mpAddMembersDialog->readSettings();
    mpAddMembersDialog->exec();
}

Вот AddMembersDialog.cpp:

#include "addmembersdialog.h"
#include "ui_addmembersdialog.h"
#include <QMessageBox>

AddMembersDialog::AddMembersDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::AddMembersDialog)
{
    ui->setupUi(this);
    connect(ui->closeFormBtn,SIGNAL(clicked()),this,SLOT(Exit()));
}
void AddMembersDialog::Exit()
{
    close();
}

void AddMembersDialog::closeEvent(QCloseEvent *event){
    QSettings settings("DevSuda", "Muwassa");
    settings.setValue("geometery", saveGeometry());
    QDialog::closeEvent(event);
}

void AddMembersDialog::readSettings(){
    QSettings settings("DevSuda", "Muwassa");
    restoreGeometry(settings.value("QDialog/geometry").toByteArray());
}

person McLan    schedule 26.04.2016    source источник


Ответы (1)


Пожалуйста, сравните ключ, используемый для следующих двух строк:

settings.setValue("geometery", saveGeometry());

и

restoreGeometry(settings.value("QDialog/geometry").toByteArray());

"geometry" против "QDialog/geometry". Должно быть так же!

также я бы предопределил ваши ключи/организацию/имя приложения в файле cpp, например:

...
static const char * ksOrganization{"DevSuda"};
static const char * ksApp         {"Muwassa"};
static const char * ksKey         {"geometery"};
...
QSettings settings(ksOrganization, ksApp);
settings.setValue(ksKey, saveGeometry());

Это помешает вам ввести ключ неправильно в одном месте...

person A.Fagrell    schedule 26.04.2016