Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: ElderOrb от Октябрь 27, 2005, 10:32



Название: Qt 4.0.1 - Изменение положения scroller-ов QScrollArea
Отправлено: ElderOrb от Октябрь 27, 2005, 10:32
Я пишу класс для рисования графиков (по некоторым причинам Qwt мне не подходит). Появилась мысль использовать QGridLayout (3x3), в коий разместить ось x, ось y, горизонтальный скролер, вертикальный скролер и в центре - собственно QScrollArea. Проблема в том, что скроллеры принадлежат QScrollArea и отрисовываются внутри её, тогда как мне нужно снаружи. Я попробовал сделать следующее:
Код:

plotLayout = new QGridLayout(this);
setLayout(plotLayout);

scrollArea = new QScrollArea(this);
scrollArea->setObjectName("scrollArea");

curveWidget = new QWidget(scrollArea);
curveWidget->setObjectName("curveWidget");

scrollArea->setWidgetResizable(true);
scrollArea->setWidget(curveWidget);

plotLayout->addWidget(new QFrame(), 0, 0);
plotLayout->addWidget(scrollArea->horizontalScrollBar(), 0, 1);
plotLayout->addWidget(new QFrame(), 0, 2);

plotLayout->addWidget(new QFrame(), 1, 0);
plotLayout->addWidget(scrollArea, 1, 1);
plotLayout->addWidget(scrollArea->verticalScrollBar(), 1, 2);

.. в результате добился того, что скролеры занимают желаемое мной положение во время ресайза. Когда же ресайз заканчивается они перепрыгивают назад во внутрь QScrollArea и то криво. Вопрос: можно ли принципиально вынести скролеры за пределы QScrollArea, и если да - каким наиболее простым способом это можно сделать?


Название: Qt 4.0.1 - Изменение положения scroller-ов QScrollArea
Отправлено: ElderOrb от Октябрь 27, 2005, 11:58
Если кому интересно, решил проблему следующим образом: те скролеры, которые показывает QScrollArea я спрятал, в нужных мне местах разместил свои скролеры и связал свои с невидимыми QScrollArea-вскими через
connect(hor, SIGNAL(valueChanged(int)), scrollArea->horizontalScrollBar(), SLOT(setValue(int)));
и т.п.

Может и кривовато зато работает ж)


Название: Qt 4.0.1 - Изменение положения scroller-ов QScrollArea
Отправлено: QCasper от Октябрь 27, 2005, 21:58
Кстати по поводу QScrollArea - наследую свой класс от вышеупомянутого, рисую какой-нить хлам в paintEvent и хочу его скролить, скрольные бегунки бегают, а эффекта никакого. Как вообще к своему собсному виджету скролы добавить? Причем имеется ввиду не потом добавить, а сделать его со скролами


Название: Qt 4.0.1 - Изменение положения scroller-ов QScrollArea
Отправлено: ElderOrb от Октябрь 28, 2005, 10:17
Цитировать
рисую какой-нить хлам в paintEvent
- в каком paintEvent ? QScrollArea-вском, или в виджэете, который в эту QScrollArea вставлен? Если первый случай - то ничего путного и не должно получиться.

Нужно как-то так:
1. создать QScrollArea
2. создать класс, унаследованный от QWidget
3. передать QScrollArea указатель на виджэт
4. в виджэте перегрузить paintEvent и отрисовывать там всё что пожелается

Полосы прокрутки будут появляться автоматически в зависимости от размеров  QScrollArea и виджэта.

p.s. Если лениво ради одного paintEvent-а делать подкласс QWidget-а, можно воспользоваться installEventFilter


Название: Qt 4.0.1 - Изменение положения scroller-ов QScrollArea
Отправлено: QCasper от Октябрь 28, 2005, 20:05
нет, так наверное не покатит, я хочу сделать компонент, к примеру, который картинки отображает, и чтобы он сразу шел со скролами


Название: Qt 4.0.1 - Изменение положения scroller-ов QScrollArea
Отправлено: ElderOrb от Октябрь 29, 2005, 12:42
Отлично покатит, и вот тому пример: http://qt4.digitalfanatics.org/articles/zoomer.html


Название: Qt 4.0.1 - Изменение положения scroller-ов QScrollArea
Отправлено: QCasper от Октябрь 29, 2005, 14:19
Цитата: "ElderOrb"
Отлично покатит, и вот тому пример: http://qt4.digitalfanatics.org/articles/zoomer.html


Я видимо неудачно объяснил. Я создал компонент. Теперь некий Вася берет и тупо бросает его в Qt Designer'e на форму и все, он сразу со скролами, которые корректно работают, а не в теле главной программы скролл создавать.


Название: Qt 4.0.1 - Изменение положения scroller-ов QScrollArea
Отправлено: ElderOrb от Октябрь 29, 2005, 17:32
Не вопрос! Этот компонент будет содержать в себе QScrollArea и наследник от QWidget-а. В чём, собственно, проблема?


Название: Qt 4.0.1 - Изменение положения scroller-ов QScrollArea
Отправлено: QCasper от Октябрь 29, 2005, 19:58
А я еще видел реализацию где компонент наследуется от QScrollArea и благодаря этому все работает, только вот какие методы QScrollArea (QAbstractArea) надо перегрузить чтобы все как надо работало, а то если просто унаследовать то скроллы появляются, но от них никаких понтов.