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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableView появляется Edit но не редактируется  (Прочитано 3878 раз)
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.
« Последнее редактирование: Март 21, 2011, 10:48 от nickla » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #1 : Март 21, 2011, 10:39 »

Код покажи.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
nickla
Гость
« Ответ #2 : Март 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;
}
 
« Последнее редактирование: Март 21, 2011, 10:42 от nickla » Записан
nickla
Гость
« Ответ #3 : Март 23, 2011, 21:38 »

Хрень какаято. Похоже на то, что после закрытия какого-либо модального окна таблица теряет фокус и показывает по даблклику поля редактирования в которые нельзя ничего ввести. Причем открываю окно заново, закрываю, даблкликаю - и все ок! Но пользователю же этого не обьяснишь.

Вот так вызываю окно модальное (DialogOrderEdit наследуется от QDialog):
Код
C++ (Qt)
void MainWindow::buttonAddOrderClick()
{
   DialogOrderEdit dialog;
   dialog.exec();
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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