Russian Qt Forum

Qt => Model-View (MV) => Тема начата: nickla от Март 21, 2011, 10:34



Название: QTableView появляется Edit но не редактируется
Отправлено: nickla от Март 21, 2011, 10:34
У меня на форме лежит QTableView который использует свою собственную модель QAbstractModel. Одну колонку можно редактировать. Проблема в том, что иногда после добавления строк в таблицу я пытаюсь редактировать ячейку таблицы появляется как и положено Edit но ничего в нем не печатается, как будто он не активен. Причем в это время абсолютно все ячейки этой колонки редактировать нельзя - пробую другие такой же эффект. Помогает только если переключиться в другое окно или открыть другое окно в программе и заново даблкликнуть по ячейке. Что это может быть?

Воспроизводится это не всегда, а както выборочно и только после добавления строки.

На всякий вот код из модели (может комуто будет интересно):
Код
C++ (Qt)
QVariant TxOrderModel::data(const QModelIndex &index, int role) const
{
   if (role == Qt::DisplayRole) {
       return m_TableData.getCellValue(index.row(), index.column());
   }
   if (role == Qt::EditRole) {
       return m_TableData.getCellValue(index.row(), index.column());
   }
   if (role == Qt::BackgroundColorRole) {
       return TxOrder::getStatusColor(m_TableData.getCellValue(index.row(), QString("order_status")).toInt());
   }
   return QVariant();
}
 
Qt::ItemFlags TxOrderModel::flags(const QModelIndex &index) const
{
   Qt::ItemFlags flags = QAbstractTableModel::flags(index);
   QString columnName = m_TableData.getColumnName(index.column());
 
   if (columnName == "driver_callsign") {
       flags |= Qt::ItemIsEditable;
   }
 
   return flags;
}
 
bool TxOrderModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
   if (role == Qt::EditRole) {
       QString columnName = m_TableData.getColumnName(index.column());
 
       if (columnName == "driver_callsign") {
           QString primaryKey = m_TableData.getRowFieldValue(index.row(), m_TableData.getKeyField());
           QString callsign = value.toString();
           if (!callsign.isEmpty()) {
               m_Order.setDriverToOrderByCallsign(primaryKey, callsign);
           }
       }
   }
   return true;
}
 

m_Order.setDriverToOrderByCallsign отправляет HTTP запрос поэтому тут ничего не подгужается. Когда данные приходят выполняется merge.


Название: Re: QTableView появляется Edit но не редактируется
Отправлено: Пантер от Март 21, 2011, 10:39
Код покажи.


Название: Re: QTableView появляется Edit но не редактируется
Отправлено: nickla от Март 21, 2011, 10:40
Смотри выше. Приложил

Пока вставил emit dataChanged(index, index); в setData() а надежде на то что документация со своим "...The dataChanged() signal should be emitted if the data was successfully set..." все таки права.

Код
C++ (Qt)
bool TxOrderModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
   if (role == Qt::EditRole) {
       QString columnName = m_TableData.getColumnName(index.column());
 
       if (columnName == "driver_callsign") {
           QString primaryKey = m_TableData.getRowFieldValue(index.row(), m_TableData.getKeyField());
           QString callsign = value.toString();
           if (!callsign.isEmpty()) {
               m_Order.setDriverToOrderByCallsign(primaryKey, callsign);
               emit dataChanged(index, index);
           }
       }
   }
   return true;
}
 


Название: Re: QTableView появляется Edit но не редактируется
Отправлено: nickla от Март 23, 2011, 21:38
Хрень какаято. Похоже на то, что после закрытия какого-либо модального окна таблица теряет фокус и показывает по даблклику поля редактирования в которые нельзя ничего ввести. Причем открываю окно заново, закрываю, даблкликаю - и все ок! Но пользователю же этого не обьяснишь.

Вот так вызываю окно модальное (DialogOrderEdit наследуется от QDialog):
Код
C++ (Qt)
void MainWindow::buttonAddOrderClick()
{
   DialogOrderEdit dialog;
   dialog.exec();
}