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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: drag and drop в QAbstractTableModel со скрытым столбцом  (Прочитано 11817 раз)
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« : Январь 14, 2016, 09:05 »

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

Необходимо перетаскивать строки в таблице со скрытым столбцом (скрыт методом mainTableView->setColumnHidden(6,true)) с помощью Drag and Drop.

Сейчас если я перетаскиваю строку, когда столбец скрыт, то перетаскивает нормально, но если после этого сделать столбец видимым, то программа вылетает.

Как это исправить?

Пишу вопрос на форумах первый раз, заранее извините, если не туда написал или простой вопрос задал.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Январь 14, 2016, 09:33 »

Проблема не с Qt, а с вашим кодом, поэтому, чтобы вам можно было помочь, приложите минимальный проект с проблемой. Лучше всего выкладывать не сам код (особенно, если его очень много), а архив с проектом. Вложение делается в "Дополнительные опции/Вложение"
Записан

YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« Ответ #2 : Январь 14, 2016, 14:59 »

Пока делал из сложного проекта простой, вылетать перестало. Но при перетаскивании данные из скрытого столбца не копируются. Да наверно и не должны.
Вопрос в том, как сделать, чтобы копировались данные скрытого столбца при перемещении.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Январь 14, 2016, 17:51 »

Я не имел опыта работы с драг и дропом, но разве внутренние перетаскивания не с помощью QAbstractItemModel::moveRows реализуются?
Записан
Bepec
Гость
« Ответ #4 : Январь 14, 2016, 18:53 »

В View Qt существует интересная особенность. То что скрыто - того нет. Потому ручками надо самому копирование осуществлять.

PS к примеру sql модель со скрытым столбцом (даже автозаполняемым) не заносит данные в базу Улыбающийся Хотя всё это актуально до пятерки. После пятерки не проверял.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Январь 14, 2016, 22:38 »

Верес, дык не вьюха же отвечает за копирование, а модель. А в модели нет скрытых столбцов.
Записан
Bepec
Гость
« Ответ #6 : Январь 14, 2016, 22:42 »

Я это понимаю и это было бы логичным. Однако оно работает как-то не так. Как уже упоминал при добавлении записи в таблицу со скрытым столбцом скрытый столбец даже не инициализировался.

PS можно конечно перепроверить и сказать абсолютно точно, но я себя не особо чуйствую для таких подвигов.
Записан
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« Ответ #7 : Январь 15, 2016, 08:36 »

Можешь поподробнее рассказать, как "ручками" копировать.
В каком классе (наследник от QTableView или QAbstractTabelModel)? С помощью какой функции?

Я пробую наследовать от QTableView и в этом наследнике переопределять метод startDrag. Пока не получается.
« Последнее редактирование: Январь 15, 2016, 08:45 от YvenTitan » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #8 : Январь 15, 2016, 09:19 »

QTableView ответственна за отображение данных. Наследник QAbstractTabelModel ответственный за хранение и манипуляцию с данными.
При работе пользователя с QTableView (отображение, редактирование) вызываются методы QAbstractTabelModel. Имхо, не нужно даже наследоваться от QTableView. Там уже всё есть самое необходимое. Работать надо со свойствами QTableView а также переопределить методы у QAbstractTabelModel для манипуляции с данными.
Записан
Bepec
Гость
« Ответ #9 : Январь 15, 2016, 09:32 »

Не суть, всё так же работает как я и сказал. View определяет какие столбцы надо копировать/перемещать. А она определяет это исходя из видимых столбцов и запрашивает их (видимые столбцы) у модели.

В принципе я так понимаю это сделано для поддержки драгенддропа из одной view в другую. Т.е. скрыл все столбцы кроме 3 - можешь спокойно копировать в таблицу с 3 столбцами.

Как это поправить? копировать в mimeData все столбцы. Но тогда вполне возможно вы не сможете копировать в другие view эти данные. Ну или если быть точным, то может что то не так пойти Веселый
Функция QMimeData *MyTableModel::mimeData(const QModelIndexList &indexes) const, вместо
Код:
foreach(QModelIndex index, indexes){
        if(index.isValid()){
            QString text = data(index,Qt::DisplayRole).toString();
            stream << text;
        }
    }
сделать
Код:
	for (int i = 0 ; i < columnCount(); i++)
{
QString text = data(createIndex(indexes[0].row(),i),Qt::DisplayRole).toString();
stream << text;
}
Тогда будут копироваться даже скрытые столбцы.

PS ну и потестировать работоспособность конечно Веселый
Записан
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« Ответ #10 : Январь 15, 2016, 09:44 »

Большущее спасибо, Верес! Работает!
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #11 : Январь 15, 2016, 11:51 »

А использовать MimeData это единственный способ перемещения строк внутри вьюхи? Я ожидал, что должно быть свойство, которое заставляет дёргать moveRows
Записан
Bepec
Гость
« Ответ #12 : Январь 15, 2016, 12:03 »

Эмм...
Тут не происходит перемещения внутри вьюхи. Тут происходит копирование в mime, удаление записи, вставка записи.

Перемещение было бы, если б не было выдирания строки из View мышкой. А по кнопке допустим.

Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #13 : Январь 15, 2016, 12:07 »

А как разрешить дроп между строками? В том числе перетащить строку и сделать её последней в таблице.
Записан
Bepec
Гость
« Ответ #14 : Январь 15, 2016, 12:25 »

Это и есть DragAndDrop.
Берём, бросаем. При взятии она удаляется из модели, при бросании добавляется.
Ну т.е. он реализован и правильно на самом деле. Ибо если запоминать выдираемые строки и их родителей, это усложнит систему % на 50 Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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