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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: cтранные вещи с QAbstarctItemView  (Прочитано 6214 раз)
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 раскоментирновать и использовать паралельно с программной навигацией то так же тормозит очень ...
как сделать навигацию по строкам правильно и без тормозов .... ?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Февраль 01, 2007, 00:56 »

ИМХО там где JListView::moveCursor правильней.
Вьюв отвечает за свою навигацию, а не главная форма.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
izoomer
Гость
« Ответ #2 : Февраль 01, 2007, 11:15 »

так вот в том то и задача ... что управление навигацией по строкам в вивере идет из главной формы .... по внешним сигналам ... или по нажатиям кнопок на главной форме ... но не кнопками клавиатуры "вверх" "вниз" ...
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Февраль 01, 2007, 15:11 »

а почему тогда не вызывать  JListView::moveCursor из главной формы, просто передавая нужный cursorAction в качестве параметра?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
izoomer
Гость
« Ответ #4 : Февраль 01, 2007, 17:35 »

вот перенес moveCursor в своем вивере в public, но ругается на то что enum CursorAction находится в протекте у QAbstarcItemView ....  подскижите как грамотно вызвать moveCursor
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #5 : Февраль 01, 2007, 21:29 »

Так как JListView наследован QAbstarcItemView - следовательно, данный энум он видит. Тут скорее всего можно его сделать публиком в JListView, и юзать JListView::CursorAction.

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

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
izoomer
Гость
« Ответ #6 : Февраль 02, 2007, 16:29 »

а можно попросить кодом показать ... очень буду признателен ...
Записан
izoomer
Гость
« Ответ #7 : Февраль 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 очень тормозит обновление .. почему ?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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