Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Igors от Апрель 06, 2015, 16:08



Название: Save автоматом
Отправлено: Igors от Апрель 06, 2015, 16:08
Добрый день

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

Спасибо


Название: Re: Save автоматом
Отправлено: Пантер от Апрель 06, 2015, 16:10
QLineEdit::textEdited


Название: Re: Save автоматом
Отправлено: Igors от Апрель 06, 2015, 16:42
QLineEdit::textEdited
Тексты там конечно небольшие (скрипты), но все же сейвить ВСЕ при каждом вводе символа - религия не позволяет  :)


Название: Re: Save автоматом
Отправлено: Пантер от Апрель 06, 2015, 16:44
Тогда editFinished. В чем конкретно у тебя проблема?


Название: Re: Save автоматом
Отправлено: Пантер от Апрель 06, 2015, 16:44
А я бы таки кнопочку сохранения справа от эдита разместил бы.


Название: Re: Save автоматом
Отправлено: Igors от Апрель 06, 2015, 16:59
Тогда editFinished. В чем конкретно у тебя проблема?
Так нет editingFinished для QTextEdit - а вообще у меня там Scintilla, но не суть

Пример: пользователь выбрал первый айтем в листе, напр "Name1" и набрал что-то в редакторе. Теперь он переключается в листе на "Name2" или добавил еще "Name3". Текущий текст надо сохранить, т.к. будет другой.


Название: Re: Save автоматом
Отправлено: sociopath от Апрель 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


Название: Re: Save автоматом
Отправлено: Igors от Апрель 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 но это оказалось плохо.

Спасибо


Название: Re: Save автоматом
Отправлено: Пантер от Апрель 07, 2015, 08:03
Тьфу, чот я не заметил, что QTextEdit. Звыняйте.


Название: Re: Save автоматом
Отправлено: Igors от Апрель 07, 2015, 09:44
Попробовал с сигналом currentItemChanged - тоже не фонтан. Проблема (типовая) что сигналы эти испускаются не только когда юзверь сменил selection, но и во многих др случаях, напр при очистке и перезаполнении списка, при перетаскивании (изменении порядка) айтемов и.т.п. Приходится рыться в каждом конкретном случае и затыкать дырки. Хорошей, ясной схемы так и не нашел. 


Название: Re: Save автоматом
Отправлено: sociopath от Апрель 07, 2015, 11:44
Я обычно перед исполнением всех "непользовательских" событий отключаю такие сигналы, а потом включаю. Не знаю, насколько это хороший способ, но ничего другого не придумал.
ps: была еще идея обрабатывать все пользовательские события, такие как keyPressEvent, mousePressEvent и пр., но мне лично это показалось жутким оверхедом


Название: Re: Save автоматом
Отправлено: sociopath от Апрель 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);
}

Но имхо тоже могут быть подводные камни и придется допиливать напильником


Название: Re: Save автоматом
Отправлено: Igors от Апрель 07, 2015, 14:16
В принципе можно ввести свой ListWidget, унаследованный от QListWidget с сигналом
Код:
void currentItemChangedByUser(QListWidgetItem *current, QListWidgetItem *previous);

и переопределить события:
Ну как-то хорошего впечатления не производит :) Ведь selection может смениться и "извне", программно, не только от мыши и клавы. Пока сделал флажки mSaveDisabled и mInDrag и окружаю ими неприятные места (там где заполняю лист и DnD). Не блеск конечно


Название: Re: Save автоматом
Отправлено: sociopath от Апрель 07, 2015, 14:51
Как вариант обязывать все функции, меняющие select, вызывать ту же функцию, которая выполняется по сигналу currentItemChangedByUser. Имхо так код будет более прозрачный, чем с флагами.