crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Текст в редактируемом комбобоксе и слот accept() диалога
radislav72
  опции профиля:
сообщение 9.5.2010, 19:32
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 1.4.2010
Пользователь №: 1585

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте!

Есть диалоговое окно, и на нем несколько LineEdit, один редактируемый Combobox и ButtonBox. При наборе в комбобоксе текста работает autocomplete, и автоматически заполняется нужным текстом.
Когда юзер нажимает кнопку "ОК" в ButtonBox-е, срабатывает слот accept(), в котором читаются все введенные значения формы и записываются в БД- то есть все Ок :)

Но тут возникла такая проблемка: когда юзер нажимает на клавиатуре кнопку Enter при активном комбобоксе, то тоже срабатывает тот же слот accept(), но попытка чтения введенного в комбобокс значения всегда дает пустую строку. Что надо сделать, чтобы прочитать не пустую строку, а введенный текст?

"Обходной маневр" в виде принудительной программной смены фокуса типа ui->ledBName->setFocus(); не дал ничего.

Вид окна с комбобоксом:


Если в ситуации, показанной на рисунке, нажать клавишу Enter, то чтение строки из комбобокса в слоте accept()
QString settl = ui->cbSettl->currentText().trimmed();

даст пустую строку, хотя там явно есть текст :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
molchanoviv
  опции профиля:
сообщение 10.5.2010, 18:56
Сообщение #2


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

Спасибо сказали: 41 раз(а)




Репутация:   5  


А код покажи. А то у меня такой код
    renameDialog *dialog = new renameDialog(this);
    if(dialog->exec()==QDialog::Accepted)
    {
        if(!dialog->ui.combobox->currentText().isEmpty())
        {
            QString str;
            str = dialog->ui.combobox->currentText();
            qDebug()<<str;        //Выводит текст из LineEdit-а
        }
    }
    dialog->deleteLater();

отрабатывает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
radislav72
  опции профиля:
сообщение 10.5.2010, 20:36
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 1.4.2010
Пользователь №: 1585

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(molchanoviv @ 10.5.2010, 18:56) *
А код покажи. А то у меня такой код ... отрабатывает.


У меня несколько другой код: в слоте accept() диалога выполняется проверка введенных даных и тут же считываются поля формы и сохраняются в полях класса.
void bankDlg::accept()
{
    ......
    settl = ui->cbSettl->currentText().trimmed();
    ......


А сам диалог показывается стандартно:
void banksDialog::on_btnAdd_clicked()
{
    bankDlg *d = new bankDlg(this, RT_ADD);
    if (d->exec() == QDialog::Accepted)
    {
        QSqlDatabase::database().transaction();
        try
        {
            QSqlQuery q;
            q.prepare("INSERT INTO members.banks (bname, settlement_id, descr) VALUES (:bname, :settlement_id, :descr)");
            ..................................
            QSqlDatabase::database().commit();
            ..................................
        } catch (...)
        {
            QSqlDatabase::database().rollback();
            return;
        }
    }
    delete d;
}


Причем, если при нажатии клавиши Enter активным является не комбобока (то-есть после ввода текста в комбобокс нажать Tab и перейти к другому виджету), то все работает нормально. Если же ввести текст в комбобокс и нажать Enter, то текст считывается пустой.

Но я, кажется, уже понял причину: дело в автозаполняемом комбобоксе.
Вроде-бы дело в том, что при редактировании текста в комбобоксе в режиме autocomplete нажатие Enter должно "фиксировать" введенный текст (то-есть, при первом нажатии Enter в autocomplete-комбооксе етот автодобавленный текст, частично введенный с клавиатуры и частично дополненный автоматикой, фиксируется- при етом курсор преходит в конец поля редактирования комбобокса). Вместе с тем, нажатие Enter вызывает accept диалога. И accept срабатывает ДО того, как "зафиксируется" текст в комбобоксе.

По крайней мере, чтение текста из комбобокса в eventFilter, настроенном на QEvent::KeyPress (и key() == Qt::Key_Return), дало нужный результат.

Возможно, существует получше решение. Но у меня пока так. Возможно, следует как-то просто изменить порядок срабатывания событий.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 14.1.2025, 6:15