Russian Qt Forum
Апрель 20, 2024, 01:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Save автоматом  (Прочитано 5571 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Апрель 06, 2015, 16:08 »

Добрый день

Есть контейнер таких простых структур
Код
C++ (Qt)
struct CData {
QString mName, mText;
};
Ну и mName отображается в QListWidget а mText в QTextEdit. Юзер нажал на mName - подставился mText в QTextEdit, этот текст можно редактировать. Как теперь автоматом/пулеметом сохранять все изменения в контейнере? (спрашивать юзера не нужно, сохранять всегда)

Спасибо
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Апрель 06, 2015, 16:10 »

QLineEdit::textEdited
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Апрель 06, 2015, 16:42 »

QLineEdit::textEdited
Тексты там конечно небольшие (скрипты), но все же сейвить ВСЕ при каждом вводе символа - религия не позволяет  Улыбающийся
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Апрель 06, 2015, 16:44 »

Тогда editFinished. В чем конкретно у тебя проблема?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Апрель 06, 2015, 16:44 »

А я бы таки кнопочку сохранения справа от эдита разместил бы.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Апрель 06, 2015, 16:59 »

Тогда editFinished. В чем конкретно у тебя проблема?
Так нет editingFinished для QTextEdit - а вообще у меня там Scintilla, но не суть

Пример: пользователь выбрал первый айтем в листе, напр "Name1" и набрал что-то в редакторе. Теперь он переключается в листе на "Name2" или добавил еще "Name3". Текущий текст надо сохранить, т.к. будет другой.
Записан
sociopath
Гость
« Ответ #6 : Апрель 06, 2015, 17:13 »

Код:
void MainWindow::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
    map[previous->text()].mText = ui->textEdit->toPlainText();
    ui->textEdit->setPlainText(map[current->text()].mText);
}
map содержит CData по ключу mName
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Апрель 06, 2015, 17:23 »

Код:
void MainWindow::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
    map[previous->text()].mText = ui->textEdit->toPlainText();
    ui->textEdit->setPlainText(map[current->text()].mText);
}
map содержит CData по ключу mName
Как раз переделываю на этот сигнал, до этого использовал currentRowChanged но это оказалось плохо.

Спасибо
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Апрель 07, 2015, 08:03 »

Тьфу, чот я не заметил, что QTextEdit. Звыняйте.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Апрель 07, 2015, 09:44 »

Попробовал с сигналом currentItemChanged - тоже не фонтан. Проблема (типовая) что сигналы эти испускаются не только когда юзверь сменил selection, но и во многих др случаях, напр при очистке и перезаполнении списка, при перетаскивании (изменении порядка) айтемов и.т.п. Приходится рыться в каждом конкретном случае и затыкать дырки. Хорошей, ясной схемы так и не нашел. 
Записан
sociopath
Гость
« Ответ #10 : Апрель 07, 2015, 11:44 »

Я обычно перед исполнением всех "непользовательских" событий отключаю такие сигналы, а потом включаю. Не знаю, насколько это хороший способ, но ничего другого не придумал.
ps: была еще идея обрабатывать все пользовательские события, такие как keyPressEvent, mousePressEvent и пр., но мне лично это показалось жутким оверхедом
« Последнее редактирование: Апрель 07, 2015, 11:47 от sociopath » Записан
sociopath
Гость
« Ответ #11 : Апрель 07, 2015, 12:04 »

В принципе можно ввести свой ListWidget, унаследованный от QListWidget с сигналом
Код:
void currentItemChangedByUser(QListWidgetItem *current, QListWidgetItem *previous);

и переопределить события:
Код:
void ListWidget::mousePressEvent(QMouseEvent *event)
{
    QListWidget* previous = currentItem();
    QListWidget::mousePressEvent(event);
    QListWidget* current = currentItem();
    if (current != previous)
        emit currentItemChangedByUser(current, previous);
}

void ListWidget::keyPressEvent(QKeyEvent *event)
{
    QListWidget* previous = currentItem();
    QListWidget::keyPressEvent(event);
    QListWidget* current = currentItem();
    if (current != previous)
        emit currentItemChangedByUser(current, previous);
}

Но имхо тоже могут быть подводные камни и придется допиливать напильником
« Последнее редактирование: Апрель 07, 2015, 12:42 от sociopath » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Апрель 07, 2015, 14:16 »

В принципе можно ввести свой ListWidget, унаследованный от QListWidget с сигналом
Код:
void currentItemChangedByUser(QListWidgetItem *current, QListWidgetItem *previous);

и переопределить события:
Ну как-то хорошего впечатления не производит Улыбающийся Ведь selection может смениться и "извне", программно, не только от мыши и клавы. Пока сделал флажки mSaveDisabled и mInDrag и окружаю ими неприятные места (там где заполняю лист и DnD). Не блеск конечно
Записан
sociopath
Гость
« Ответ #13 : Апрель 07, 2015, 14:51 »

Как вариант обязывать все функции, меняющие select, вызывать ту же функцию, которая выполняется по сигналу currentItemChangedByUser. Имхо так код будет более прозрачный, чем с флагами.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.12 секунд. Запросов: 22.