Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: kadr от Декабрь 10, 2009, 11:54



Название: Завершение редактирования текста в ячейке!
Отправлено: kadr от Декабрь 10, 2009, 11:54
Привет всем, скажите, вот есть форма, на ней есть таблица(QTableWidget), при нажатии на пробел выделяется определенная ячейка текущей строки, в ней меняем текст и потом по нажатии на Enter должно происходить сравнение предыдущего числа с текущим. Так вот проблема в том, что после нажатия на Enter он берет старое число, такое ощущение, что изменения еще не вступили в силу!
Кусок кода:
 if (keyEvent->key()==Qt::Key_Space)
            {
                st_kol = m_ui->pole->item(m_ui->pole->currentRow(),2)->text().trimmed();
                m_ui->pole->editItem(m_ui->pole->item(m_ui->pole->currentRow(),2));

            }
if ((keyEvent->key()==Qt::Key_Return) || (keyEvent->key()==Qt::Key_Enter))
            {
                
                st_aft = m_ui->pole->item(m_ui->pole->currentRow(),2)->text().trimmed();
                if (st_aft != st_kol)
                {
                    qDebug() <<tr("Есть изменения");
                    qDebug() <<st_kol;
                    qDebug() <<st_aft;
                }
                else
                {
                    qDebug() <<tr("Нет изменений");
                    qDebug() <<st_kol;
                    qDebug() <<st_aft;
                }
           }


Название: Re: Завершение редактирования текста в ячейке!
Отправлено: Пантер от Декабрь 10, 2009, 12:33
Данные еще не успели попасть в таблицу.


Название: Re: Завершение редактирования текста в ячейке!
Отправлено: kadr от Декабрь 10, 2009, 12:36
Данные еще не успели попасть в таблицу.
Я это понимаю, так вот как можно сделать что бы они попали туда!


Название: Re: Завершение редактирования текста в ячейке!
Отправлено: Пантер от Декабрь 10, 2009, 12:39
Цитировать
void QTableWidget::itemChanged ( QTableWidgetItem * item )   [signal]
This signal is emitted whenever the data of item has changed.


Название: Re: Завершение редактирования текста в ячейке!
Отправлено: kadr от Декабрь 10, 2009, 12:42
Цитировать
void QTableWidget::itemChanged ( QTableWidgetItem * item )   [signal]
This signal is emitted whenever the data of item has changed.
Предлагаете внутри этой функции заносить новые данные в глобальную переменную и при нажатии на Enter сравнивать их?


Название: Re: Завершение редактирования текста в ячейке!
Отправлено: kadr от Декабрь 10, 2009, 14:10
Попробовал я так сделать, объявил глобальную переменную, засунул ее внутрь этой функции, получается что при изменении текста в ячейке в переменную заноситься 1.Ничего не понятно!
void look_zakaz::on_pole_itemChanged(QTableWidgetItem* item)
{
    st_aft.clear();
    st_aft = item->text().trimmed();
}


Название: Re: Завершение редактирования текста в ячейке!
Отправлено: kadr от Декабрь 10, 2009, 14:31
Касяк в том, что после нажатия на enter, сначала происходит:
if ((keyEvent->key()==Qt::Key_Return) || (keyEvent->key()==Qt::Key_Enter))
            {

               if (st_aft != st_kol)
                {
                    qDebug() <<tr("Есть изменения") << st_aft;

                    st_aft.clear();
                }
                else
                {
                    qDebug() <<tr("Нет изменений") << st_aft;

                    st_aft.clear();
                }
                //m_ui->pole->editItem(m_ui->pole->item(m_ui->pole->currentRow(),2));
            }
а потом:
void look_zakaz::on_pole_itemChanged(QTableWidgetItem* item)
{
    st_aft.clear();
    st_aft = item->text().trimmed();
    qDebug() << st_aft;
}
а надо что бы данные были получены раньше.


Название: Re: Завершение редактирования текста в ячейке!
Отправлено: Danila_Bagrofff от Декабрь 10, 2009, 15:59
а как на счет использования модели данных? Там разве нельзя посмотреть текущее значение данных?


Название: Re: Завершение редактирования текста в ячейке!
Отправлено: kadr от Декабрь 10, 2009, 17:44
а как на счет использования модели данных? Там разве нельзя посмотреть текущее значение данных?
Спасибо за советы, я уже решил проблему!  :)


Название: Re: Завершение редактирования текста в ячейке!
Отправлено: Danila_Bagrofff от Декабрь 11, 2009, 09:00
To kadr:
так написал бы, как ты решил проблему =)

Вдруг у кого-то еще может возникнуть похожая проблема =)

Ответу стоит писать =) Это ж форум для всех =)


Название: Re: Завершение редактирования текста в ячейке!
Отправлено: kadr от Декабрь 11, 2009, 09:33
To kadr:
так написал бы, как ты решил проблему =)

Вдруг у кого-то еще может возникнуть похожая проблема =)

Ответу стоит писать =) Это ж форум для всех =)
Проблему решил просто, при начале редактирования, то есть в моем случае, при нажатии на пробел, в глобальную переменную заносятся номера строки и колонки изменяемой ячейки.
if (keyEvent->key()==Qt::Key_Space)
            {
                row_cur = 0;
                column = 0;
                st_kol = m_ui->pole->item(m_ui->pole->currentRow(),2)->text().trimmed();
                m_ui->pole->editItem(m_ui->pole->item(m_ui->pole->currentRow(),2));
                row_cur = m_ui->pole->currentRow();
                column = m_ui->pole->currentColumn();
            }
Далее в void look_zakaz::on_pole_itemChanged(QTableWidgetItem* item) сравниваю данные в этих переменных с текущими данными.
QString SQL;
    QSqlQuery q;
    st_aft.clear();
    st_aft = item->text().trimmed();
    if ((m_ui->pole->currentRow() == row_cur) && (m_ui->pole->currentColumn() == column) && (st_kol != st_aft))
    {
        SQL = QString("UPDATE zakaz SET kolvo = %1 WHERE name = '%2' AND zavod = '%3' AND srokdo = '%4' AND postavcik = '%5' AND ok = %6")
              .arg(st_aft.toInt())
              .arg(m_ui->pole->item(m_ui->pole->currentRow(),0)->text().trimmed())
              .arg(m_ui->pole->item(m_ui->pole->currentRow(),1)->text().trimmed())
              .arg(m_ui->pole->item(m_ui->pole->currentRow(),3)->text().trimmed())
              .arg(m_ui->pole->item(m_ui->pole->currentRow(),5)->text().trimmed())
              .arg(m_ui->pole->item(m_ui->pole->currentRow(),7)->text().toInt());
        q.exec(SQL);
        st_aft.clear();
    }
    else
    {
        return;
    }
Вот и все!