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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как узнать какие строки видны в данный момент в QTableWidget?  (Прочитано 4884 раз)
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« : Декабрь 05, 2008, 15:41 »

Всем доброго времени суток!
Помогите разобраться:
Имеется таблица, созданная при помощи QTableWidget. Сам виджет таблицы небольшого размера по вертикали, поэтому имеется вертикальный скрол. Возникла необходимость узнать: какие строки таблицы в данный момент времени видны, а какие скрыты за пределами виджета.
Всем заранее спасибо!
Записан
EhTemka
Гость
« Ответ #1 : Декабрь 05, 2008, 17:16 »

Код
C++ (Qt)
QRect vr = tableWidget->rect();  
QList<QTableWidgetItem *> itemVisual;
QList<QTableWidgetItem *> itemNotVisual;
for (int i = 0; i < tableWidget->rowCount(); ++i) {
  for (int j = 0; j < tableWidget->columnCount(); ++j) {                
QTableWidgetItem *item = tableWidget->item(i, j);
 
               QRect r = tableWidget->visualItemRect(item);
if (vr.contains(r) || vr.intersects(r)) {
itemVisual->append(item);
} else {
                       itemNotVisual->append(item);
               }
  }
}

Так можно
« Последнее редактирование: Декабрь 05, 2008, 17:18 от EhTemka » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #2 : Декабрь 05, 2008, 18:35 »

EhTemka, а если в таблице будет миллион строк? Подмигивающий

1) Опеределяем геометрию таблицы
2) Организовываем вложенные циклы по этой области
3) Пользуемся методом QTableWidget::itemAt для получение item

зы: счетчики циклов можно увеличивать на ширину столбца и высоту строки соответсвенно.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
EhTemka
Гость
« Ответ #3 : Декабрь 05, 2008, 18:55 »

Posted by: OS2
Цитировать
а какие скрыты за пределами виджета.

To Pastor :
Тогда объясни как узнать скрытые.  Подмигивающий
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Декабрь 05, 2008, 19:01 »

Тогда объясни как узнать скрытые.  Подмигивающий

Ну недочитал малехо  Смеющийся
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
EhTemka
Гость
« Ответ #5 : Декабрь 05, 2008, 19:15 »

Кстати мой код можно оптимизировать

Код
C++ (Qt)
QRect vr = tableWidget->rect();  
QList<QTableWidgetItem *> itemVisual;
QList<QTableWidgetItem *> itemNotVisual;
int i;
bool stop = false;
 
for (i = 0; i < tableWidget->rowCount(); ++i) {
 
  for (int j = 0; j < tableWidget->columnCount(); ++j) {                
QTableWidgetItem *item = tableWidget->item(i, j);
               QRect r = tableWidget->visualItemRect(item);
 
               if(r.top() < 0) {
                        itemNotVisual->append(item);
                        continue;
               } else if (r.y() > vr.top()) {
                        stop =true;
                        break;
               }
 
if (vr.contains(r) || vr.intersects(r)) {
itemVisual->append(item);
} else {
                       itemNotVisual->append(item);
               }
  }
 
  if (stop) {
        break;
  }
 
}
 
if (stop) {
  for (int ii = i; ii < tableWidget->rowCount(); ++ii) {
     for (int j = 0; j < tableWidget->columnCount(); ++j) {  
          itemNotVisual->append(tableWidget->item(ii, j));
     }
  }
}
 

Могут быть опечатки, писал здесь
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #6 : Декабрь 05, 2008, 19:20 »

Спасибо за помощь!
Попробую внедрить.....  Смеющийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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