crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Объединение ячеек
Gbx
  опции профиля:
сообщение 12.11.2016, 14:49
Сообщение #1


Новичок


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

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




Репутация:   0  


Добрый день!
Необходимо объединять отдельные ячейки в зависимости от содержания. Использование QTablwiew::setSpan считаю нерациональным, поскольку используется сортировка после которой объединение остается на прежнем месте, а данные перемещаются, необходимо снова считывать данные и менять объединение.
Хочу сделать это через делегата, но не знаю каким образом использовать метод setSpan, прошу подсказать!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 13.11.2016, 12:14
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2936
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   35  


сделай в методе модели data роли Qt::DisplayRole

проверяй для ячейки: если текущий tableview->rowSpan или tableview->columnSpan не равен требуемому в данный момент, то выставляй требуемый tableview->setSpan

оно там, правда, для длины 1 варнинги в консоль вываливает, помнится, но на это можно не обращать внимания

Сообщение отредактировал Алексей1153 - 13.11.2016, 12:15
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Gbx
  опции профиля:
сообщение 14.11.2016, 18:37
Сообщение #3


Новичок


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

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




Репутация:   0  


Цитата(Алексей1153 @ 13.11.2016, 13:14) *
сделай в методе модели data роли Qt::DisplayRole

проверяй для ячейки: если текущий tableview->rowSpan или tableview->columnSpan не равен требуемому в данный момент, то выставляй требуемый tableview->setSpan

оно там, правда, для длины 1 варнинги в консоль вываливает, помнится, но на это можно не обращать внимания

Спасибо за ответ, пока сделал так: в модели:
QSize myModel::span(const QModelIndex &index) const
{
if (_data[index.row()][index.column()] == "0"){
return QSize(2,1);
}
else return QAbstractTableModel::span(index);
}
в представлении так:
void myView::setModel(QAbstractItemModel *model)
{
QTableView::setModel(model);
for (int row = 0; row < this->model()->rowCount(); row++)
{
for (int col = 0; col < this->model()->columnCount(); col++)
{
QSize span = this->model()->span(this->model()->index(row, col));
this->setSpan(row, col, span.height(), span.width());
}
}
}
В принципе работает, но только если proxy наложить, то перестает. Твой совет не совсем понял:
1. Что нужно реализовать в модели для роли Qt::DisplayRole
2. Где осуществлять проверку tableview->rowSpan... Если уже для экземпляра класса tableview, то это, как я писал, не то что нужно.
можно простой пример? Может знаешь как обратиться из делегата к ячейке? Например, из делегата обращаюсь к данным в ячейке - index.data(), далее обращаюсь к самой ячейке и тогда делаю как ты пишешь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 15.11.2016, 7:32
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2936
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   35  


Gbx, в виртуальном span модели тоже подойдёт, но я прямо в data выставлял )

tableview у меня - это указатель на виджет, куда модель присоединена. У меня это член класса, а указатель я передал через конструктор.

Содержимое myView::setModel в твоём примере - не нужно (кроме вызова родительского setModel, само собой).

Сообщение отредактировал Алексей1153 - 15.11.2016, 7:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Gbx
  опции профиля:
сообщение 16.11.2016, 18:49
Сообщение #5


Новичок


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

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




Репутация:   0  


Спасибо, попробую
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Gbx
  опции профиля:
сообщение 24.2.2017, 10:01
Сообщение #6


Новичок


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

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




Репутация:   0  


Пробовал по разному, но результат один при сортировке все нарушается. Делал в паре модель-представление. Пробовал через сигнал/слот при сортировке менять объединение, но результат тот же
connect(tableView->horizontalHeader(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), this, SLOT(slotSetSpan()));

void tabData::slotSetSpan()
{
tableView->clearSpans();
for (int i = 0; i < tableView->model()->rowCount(); i++){
int code = tableView->model()->data((tableView->model()->index(i, 2))).toInt();
if(code == 125) tableView->setSpan(i, 3, 1, tableView->model()->columnCount() - 3);
}
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.3.2017, 22:03