crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Разные варианты выделения мышью в QTableView, точнее, различный порядок добавления индексов
Гость_retif_*
сообщение 7.12.2012, 21:10
Сообщение #1





Гости








    


На форме находится QTableView, у него выставлены свойства:
  • selectionMode: MultiSelection;
  • selectioBehavior: SelectRows.

Пример таблицы:

1 | 2 | 3
-----------
4 | 5 | 6


Выделение строк мышью (порядок считывания индексов) происходит двумя способами (это не я сделал, это так на стандартных классах):

  1. при выделении строк мышью поштучно (один клик - одна строка), индексы в модель выделения попадают в одном порядке (1, 2, 3, 4, 5, 6);
  2. если же нажать кнопку мыши, протянуть по строкам и отпустить, то индексы в модель выделения попадут в другом порядке (1, 4, 2, 5, 3, 6). В таком же порядке они туда попадают, если выделить все записи в таблице нажатием на угловую кнопку (cornerButton).

Как можно отличать, каким именно способом произошло выделение? Мне нужно записать выделенные строки в файл, но я могу учесть только один из вариантов. Мне требуется записывать построчно, как при первом варианте (выделено зелёным цветом).

Саму запись в файл делаю так (опуская подробности):
QModelIndexList indexes = _model->selectedIndexes();
for (int x = 0; x < indexes.count(); x++)
    exportFile.write(indexes.at(x).data().toString().toAscii());
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 7.12.2012, 22:08
Сообщение #2


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Есть такой прикол.
Проще всего просто пройтись по строкам и самому проверить выделены ли они.
Либо генерерировать массив с привязкой к id строки, если такая имеется, и потом его сортировать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.12.2012, 22:31
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Вот тебе вырезка:
 QModelIndex    index;
  unsigned int    minrow, mincolumn;
  unsigned int    maxrow, maxcolumn;
  unsigned int    i, j;
  QString        str;


    // Ищем минимумы и максимумы
    const QItemSelection ranges = view->selectionModel()->selection();
    
    minrow = ranges.at(0).top();
    mincolumn = ranges.at(0).left();
    
    maxrow = ranges.at(ranges.size()-1).bottom();
    maxcolumn = ranges.at(ranges.size()-1).right();

    qDebug() << "Copy, FROM" << QString("(%1,%2)").arg(minrow).arg(mincolumn)
             << "TO" << QString("(%1,%2)").arg(maxrow).arg(maxcolumn);
    
    // Само копирование
    for (i=minrow; i <= maxrow; ++i)
    {
        if (i>minrow)
            str += "\n";
        for (j=mincolumn; j <= maxcolumn; ++j)
        {
            if (j>mincolumn)
                str += "\t";
            index = view->model()->index(i, j, QModelIndex());
            QString t = view->model()->data(index).toString();
            str += t;
        }
    }
    qDebug() << "Copy:\n" << str;
    return str;
этот фрагмент кода, копирует данные из таблицы в str, доработай его.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
retif
  опции профиля:
сообщение 8.12.2012, 1:01
Сообщение #4


Новичок


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

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




Репутация:   0  


Litkevich Yuriy, да, код прекрасно работает при обоих видах выделения, которые я перечислил. Спасибо, по готовому будет легче разобраться. Я даже не знаю, что можно доработать, потому что для моих целей тут всё уже есть.

Только вопрос, под выделение сейчас попадают также и промежуточные строки: например, я выделю только две, 1 и 5 строки, и хотя выделенными на view отобразятся лишь они, но в выделение и в результат попадут кроме них также 2, 3 и 4 строки, то есть оно выделяет "сплошным прямоугольником" по углам. Это вы и имели в виду под доработкой? Или никак иначе выделение не работает?

RazrFalcon, признаться, я не понял про сортировку. А вот про проверку выделено/не выделено я даже как-то и не подумал, надо попробовать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 1.2.2013, 8:17
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

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




Репутация:   8  


Можно еще посмотреть на http://doc.qt.digia.com/qt/qitemselectionm...ml#selectedRows
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 22.11.2024, 11:16