Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 Как создать форму QT, чтобы виджеты сохраняли свои значения между запусками приложения?  [new]
AlekseySQL
Member

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

Есть у Qt- формы или отдельных ее виджетов возможность сохранять значения между сеансами работы пользователя?
18 апр 17, 10:03    [20409761]     Ответить | Цитировать Сообщить модератору
 Re: Как создать форму QT, чтобы виджеты сохраняли свои значения между запусками приложения?  [new]
NekZ
Member

Откуда: Санкт-Петербург
Сообщений: 2116
AlekseySQL,

Можно лишь сохранить положения всех панелей у QMainWindow (см. http://doc.qt.io/qt-4.8/qmainwindow.html#saveState).
А так, можешь пользоваться QSettings чтобы сохранить значения всех полей. Не думаю, что уйдёт много труда чтобы пробежаться в цикле по всем виджетам, вытащить из них значения и заперсистить их по objectName'у в QSettings.
18 апр 17, 11:13    [20410016]     Ответить | Цитировать Сообщить модератору
 Re: Как создать форму QT, чтобы виджеты сохраняли свои значения между запусками приложения?  [new]
AlekseySQL
Member

Откуда:
Сообщений: 146
NekZ,

спасибо!

А как обойти все виждеты формы типа QlineEdit? Я не нашел метода кроме прописывания списка виджетов руками.
18 апр 17, 12:36    [20410399]     Ответить | Цитировать Сообщить модератору
 Re: Как создать форму QT, чтобы виджеты сохраняли свои значения между запусками приложения?  [new]
NekZ
Member

Откуда: Санкт-Петербург
Сообщений: 2116
AlekseySQL,

Если ты знаком с механизмом Parent-Children Ownership в Qt и с метаобъектной системой, то это должно быть просто:
for( QObject * child: mainWindow->children() )
{
  if( QLineEdit * edit = qobject_cast< QLineEdit * >( child ) )
  {
    // persist the value from edit->text()
  }
}
18 апр 17, 12:57    [20410509]     Ответить | Цитировать Сообщить модератору
 Re: Как создать форму QT, чтобы виджеты сохраняли свои значения между запусками приложения?  [new]
AlekseySQL
Member

Откуда:
Сообщений: 146
NekZ,

Спасибо, познакомлюсь с механизмом Parent-Children Ownership :)
18 апр 17, 13:40    [20410695]     Ответить | Цитировать Сообщить модератору
 Re: Как создать форму QT, чтобы виджеты сохраняли свои значения между запусками приложения?  [new]
AlekseySQL
Member

Откуда:
Сообщений: 146
Кто подскажет, почему при закрытии формы в деструкторе класса диалога не срабатывает точка останова?

DlgEncoding::~DlgEncoding()
{
    //сохраним значения
    MyLib::WriteDialogVariable(this, "DirEncoding"); //ЭТОТ КОД НЕ ВЫЗЫВАЕТСЯ!!!

    delete ui;
}



В итоге я не могу сохранить значения виджетов формы.
21 апр 17, 13:02    [20421979]     Ответить | Цитировать Сообщить модератору
 Re: Как создать форму QT, чтобы виджеты сохраняли свои значения между запусками приложения?  [new]
AlekseySQL
Member

Откуда:
Сообщений: 146
Я в главном окне сигналам нажатия на пункты меню назначил слоты, в которых открываются формы:

void MainWindow::ShowFormEncoding()
{
    DlgEncoding *w = new DlgEncoding;
    w->setModal(true);
    w->show();
}


но вот при интерактивном закрытии деструкторы этих форм не вызываются.
21 апр 17, 13:15    [20422055]     Ответить | Цитировать Сообщить модератору
 Re: Как создать форму QT, чтобы виджеты сохраняли свои значения между запусками приложения?  [new]
NekZ
Member

Откуда: Санкт-Петербург
Сообщений: 2116
AlekseySQL
Я в главном окне сигналам нажатия на пункты меню назначил слоты, в которых открываются формы:

void MainWindow::ShowFormEncoding()
{
    DlgEncoding *w = new DlgEncoding;
    w->setModal(true);
    w->show();
}


но вот при интерактивном закрытии деструкторы этих форм не вызываются.


У тебя memory leak. Вообще, там new не нужен, это тебе не Java.
void MainWindow::ShowFormEncoding()
{
    DlgEncoding w;
    w.setModal(true);
    w.show();
}

Вот так деструктор будет вызываться как надо.
21 апр 17, 13:25    [20422105]     Ответить | Цитировать Сообщить модератору
 Re: Как создать форму QT, чтобы виджеты сохраняли свои значения между запусками приложения?  [new]
AlekseySQL
Member

Откуда:
Сообщений: 146
NekZ,

Так деструктор вызывается сразу и форма не открывается. С тем же эффектом я мог написать

DlgEncoding *w = new DlgEncoding;
w->setModal(true);
w->show();
delete w;
21 апр 17, 13:35    [20422156]     Ответить | Цитировать Сообщить модератору
 Re: Как создать форму QT, чтобы виджеты сохраняли свои значения между запусками приложения?  [new]
NekZ
Member

Откуда: Санкт-Петербург
Сообщений: 2116
AlekseySQL,

ПардонЪ. Используй exec() вместо show(). Если я правильно понял, у тебя DlgEncoding наследуется от QDialog.
21 апр 17, 13:48    [20422283]     Ответить | Цитировать Сообщить модератору
 Re: Как создать форму QT, чтобы виджеты сохраняли свои значения между запусками приложения?  [new]
AlekseySQL
Member

Откуда:
Сообщений: 146
NekZ
AlekseySQL,

ПардонЪ. Используй exec() вместо show(). Если я правильно понял, у тебя DlgEncoding наследуется от QDialog.


Спасибо, работает!
21 апр 17, 13:51    [20422314]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить