Russian Qt Forum

Qt => Model-View (MV) => Тема начата: izoomer от Январь 31, 2007, 13:44



Название: cтранные вещи с QAbstarctItemView
Отправлено: izoomer от Январь 31, 2007, 13:44
[qt-4.2 Linux]
есть модель ....
item_1
item_1_2
item_1_3
item_1_4
item_2
item_2_1
item_2_2
item_2_3
item_2_4

и так далее ...
и два вивера созданных от QAbstarctItemView - JListView.

Если в моём классе JListView, созданом от QAbstarctItemView, прописано
Код:

QModelIndex JListView::moveCursor(QAbstractItemView::CursorAction cursorAction,
                                Qt::KeyboardModifiers /*modifiers*/)
{
    QModelIndex current = currentIndex();

    switch (cursorAction) {
        case MoveLeft:
        case MoveUp:
            if (current.row() > 0)
                current = model()->index(current.row() - 1, current.column(),
                                         rootIndex());
            else
                current = model()->index(0, current.column(), rootIndex());
            break;
        case MoveRight:
        case MoveDown:
            if (current.row() < rows(current) - 1)
                current = model()->index(current.row() + 1, current.column(),
                                         rootIndex());
            else
                current = model()->index(rows(current) - 1, current.column(),
                                         rootIndex());
            break;
        default:
            break;
    }

    viewport()->update();
    return current;
}

и в MainWindow создан экземпляр JListView
то кнопками перемещения курсора навигация по строкам идет так как надо .... однако ... если этот метод в реализации класса JListView закоментировать и использовать программную навигацию по строкам непосредственно в классе MainWindow, такого вида:
Код:

void MainWindow::selectPrevItem(){

   if (model->rowCount() <= 1)
   {
   } else
   {
      int iRow = my_ JList->currentIndex().row();
      if (0 < iRow)
      {
         my_ JList->setCurrentIndex(model->index(iRow - 1, 0));
      }
   }
}

void MainWindow::selectNextItem(){

   if (model->rowCount() <= 1)
   {
    return;
   } else
   {
      int iRow = my_ JList->currentIndex().row();
      if (model->rowCount()-1 > iRow)
      {
         my_ JList->setCurrentIndex(model->index(iRow + 1, 0));
      }
   }
}


то навигация тормозит очень сильно ... тормозит именно перемещение построкам ... как бы с замерзанием . Если реализацию moveCursor раскоментирновать и использовать паралельно с программной навигацией то так же тормозит очень ...
как сделать навигацию по строкам правильно и без тормозов .... ?


Название: cтранные вещи с QAbstarctItemView
Отправлено: Racheengel от Февраль 01, 2007, 00:56
ИМХО там где JListView::moveCursor правильней.
Вьюв отвечает за свою навигацию, а не главная форма.


Название: cтранные вещи с QAbstarctItemView
Отправлено: izoomer от Февраль 01, 2007, 11:15
так вот в том то и задача ... что управление навигацией по строкам в вивере идет из главной формы .... по внешним сигналам ... или по нажатиям кнопок на главной форме ... но не кнопками клавиатуры "вверх" "вниз" ...


Название: cтранные вещи с QAbstarctItemView
Отправлено: Racheengel от Февраль 01, 2007, 15:11
а почему тогда не вызывать  JListView::moveCursor из главной формы, просто передавая нужный cursorAction в качестве параметра?


Название: cтранные вещи с QAbstarctItemView
Отправлено: izoomer от Февраль 01, 2007, 17:35
вот перенес moveCursor в своем вивере в public, но ругается на то что enum CursorAction находится в протекте у QAbstarcItemView ....  подскижите как грамотно вызвать moveCursor


Название: cтранные вещи с QAbstarctItemView
Отправлено: Racheengel от Февраль 01, 2007, 21:29
Так как JListView наследован QAbstarcItemView - следовательно, данный энум он видит. Тут скорее всего можно его сделать публиком в JListView, и юзать JListView::CursorAction.

добавлено спустя 3 минуты:

 или как вариант сделать JListView::moveCursorInt, куда передавать интовое значение CursorAction, где кастить его к QAbstractItemView::CursorAction и вызывать уже родной JListView::moveCursor.


Название: cтранные вещи с QAbstarctItemView
Отправлено: izoomer от Февраль 02, 2007, 16:29
а можно попросить кодом показать ... очень буду признателен ...


Название: cтранные вещи с QAbstarctItemView
Отправлено: izoomer от Февраль 03, 2007, 17:09
странно ... определили слоты для перемещения по строкам вивера
Код:

void JListView::selectNextItem()
{
moveCursor(QAbstractItemView::MoveDown);
}

void JListView::selectPrevItem()
{
moveCursor(QAbstractItemView::MoveUp);
}

moveCursor вызывается , однако ничего на экране не перемещается ... а от клавиатуры все работает
Код:

QModelIndex JListView::moveCursor(QAbstractItemView::CursorAction cursorAction,
                                Qt::KeyboardModifiers /*modifiers*/)
{

    QModelIndex current = currentIndex();

    switch (cursorAction) {
        case MoveLeft:
        case MoveUp:
            if (current.row() > 0)
                current = model()->index(current.row() - 1, current.column(),
                                         rootIndex());
            else
                current = model()->index(0, current.column(), rootIndex());
            break;
        case MoveRight:
        case MoveDown:
qDebug() << "moveCursor - Down";

            if (current.row() < rows(current) - 1)
                current = model()->index(current.row() + 1, current.column(),
                                         rootIndex());
            else
                current = model()->index(rows(current) - 1, current.column(),
                                         rootIndex());
            break;
        default:
            break;
    }

    viewport()->update();
    return current;
}



ещё выяснил, что если для двух виверов использовать одну модель (как в моем случае), и в одном вивере отображать корневые итемы а в другом все дочерние итемы выбранного в данный момент корневого итема в первом вивере , то при клике - установка setRootIndex очень тормозит обновление .. почему ?