Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: OS2 от Декабрь 05, 2008, 15:41



Название: Как узнать какие строки видны в данный момент в QTableWidget?
Отправлено: OS2 от Декабрь 05, 2008, 15:41
Всем доброго времени суток!
Помогите разобраться:
Имеется таблица, созданная при помощи QTableWidget. Сам виджет таблицы небольшого размера по вертикали, поэтому имеется вертикальный скрол. Возникла необходимость узнать: какие строки таблицы в данный момент времени видны, а какие скрыты за пределами виджета.
Всем заранее спасибо!


Название: Re: Как узнать какие строки видны в данный момент в QTableWidget?
Отправлено: EhTemka от Декабрь 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);
               }
  }
}

Так можно


Название: Re: Как узнать какие строки видны в данный момент в QTableWidget?
Отправлено: pastor от Декабрь 05, 2008, 18:35
EhTemka, а если в таблице будет миллион строк? ;)

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

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


Название: Re: Как узнать какие строки видны в данный момент в QTableWidget?
Отправлено: EhTemka от Декабрь 05, 2008, 18:55
Posted by: OS2
Цитировать
а какие скрыты за пределами виджета.

To Pastor :
Тогда объясни как узнать скрытые.  ;)


Название: Re: Как узнать какие строки видны в данный момент в QTableWidget?
Отправлено: pastor от Декабрь 05, 2008, 19:01
Тогда объясни как узнать скрытые.  ;)

Ну недочитал малехо  ;D


Название: Re: Как узнать какие строки видны в данный момент в QTableWidget?
Отправлено: EhTemka от Декабрь 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));
     }
  }
}
 

Могут быть опечатки, писал здесь


Название: Re: Как узнать какие строки видны в данный момент в QTableWidget?
Отправлено: OS2 от Декабрь 05, 2008, 19:20
Спасибо за помощь!
Попробую внедрить.....  ;D