Qt_4.4 конечно хорошая штука, но пока нет релиза, использовать ее - не могу.
Следующий пример кода, хотя немного проще чем моя идея по реализации скроллинга, но, тем не менее, он достаточно ярко демонстрирует проблему.
Создается огромного размера рект, в который сажается 1000 маленьких ректов.
Основной рект делается таскаемым.
Попробуйте октомпилить этот код, и потаскать рект.
Получите жуткие тормоза.
#include <QApplication>
#include <QGraphicsRectItem>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QtGlobal>
#define CNCHILDS 1000
#define getrandom(min, max) ((qrand()%(int)(((max) + 1)-(min)))+ (min))
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene* pscene = new QGraphicsScene();
QGraphicsRectItem* pMainRect = new QGraphicsRectItem;
QSizeF szChild(200, 40);
pMainRect->setFlag(QGraphicsItem::ItemIsMovable);
pMainRect->setRect(0,0, szChild.width(), CNCHILDS*szChild.height());
pMainRect->setBrush(Qt::green);
for (int i=0; i < CNCHILDS; i++)
{
QGraphicsRectItem* prcChild = new QGraphicsRectItem(pMainRect);
prcChild->setRect(0, i*(szChild.height()), szChild.width(), szChild.height());
prcChild->setBrush(QColor(
getrandom(100,150),
getrandom(100,150),
getrandom(100,150)
));
}
pscene->addItem(pMainRect);
QGraphicsView* pview = new QGraphicsView;
pview->setGeometry(50,50,800,600);
pview->setScene(pscene);
pview->show();
a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
a.exec();
return 0;
}
Еще была идея использовать еще одну сцену в памяти, рисовать элементы в нее, а затем выплевывать на экран изображение с помощью QGraphicsScene::render(...). Таскание тогда дполучаеться приемлимое, но теряется интерактивность элементов (перерисовка при ховере, клики и пр.)
Если бы можно было бы как-то завернуть QGraphicsScene внутрь QGraphicsItem и не потерять интеративность, то возможно проблема бы решалась. Но как это сделать - вопрос.
Здесь Qt_4.4 конечно могла бы помочь, за счет вставления QGraphicsView как виджета в сцену, но пока нет релиза использовать ее - опасно.