Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QScrollArea, скоролы не появляются
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
RazrFalcon
Раскрывающийся текст
Такая вот проблема, вниз этих QGraphicsView уходит еще с 10-ок, но что б я не делал скролы не реагируют никак.
Скрол бары выставлены в примере "показывать всегда", так как если выставить "показывать при необходимости" то они просто не появляются.
Пробовал управлять баром отдельно и через создание QVBoxLayout с QGraphicsView, ничего.
Добавляю так:
    for(int i=0;i<gv_count;i++)
    {
        list.append(new QGraphicsView(scrollArea));
        //list.append(new QGraphicsView(scrollAreaWidgetContents));
    }

Litkevich Yuriy
а как ты управляешь размещением виджетов внутри QScrollArea?
RazrFalcon
Цитата(Litkevich Yuriy @ 13.8.2010, 21:41) *
а как ты управляешь размещением виджетов внутри QScrollArea?
Всмысле?
Это что ли?
void MainWindow::resizeEvent(QResizeEvent *e)
{
    scrollArea->setGeometry(0,0,width()-100,height());
    int x=10, y=10, c=0;
    int  k=(scrollArea->width())/(gviev_wight+20);
    for (int i=0; i<list.count();i++)
    {
        list[i]->setGeometry(x,y,gviev_wight,gviev_height);
        x+=gviev_wight+10;
        c++;
        if (c==k) {y+=gviev_height+10; x=10; c=0;}
    }
Litkevich Yuriy
Цитата(RazrFalcon @ 14.8.2010, 1:58) *
Всмысле?
в прямом, ты их помещаешь в компоновщик установленный для QScrollArea?
RazrFalcon
Цитата(Litkevich Yuriy @ 13.8.2010, 22:42) *
ты их помещаешь в компоновщик установленный для QScrollArea?

Я не понимаю. :unsure: Какой компоновщик, QVBoxLayout что ли, если да то на него а его потом в арию. А вообще, просто все QGraphicsView скидываю в Арию и каждому задаю позицию внутри.
Litkevich Yuriy
Цитата(RazrFalcon @ 14.8.2010, 3:42) *
Какой компоновщик, QVBoxLayout что ли
ну хотябы его, но судя по снимку экрана должен быть QGridLayout
Приведи эту часть кода (компоновка области прокрутки)
RazrFalcon
Litkevich Yuriy, В том то и дело что QVBoxLayout и QGridLayout не подходят, я в 3-м сообщении привел код, там циклом раскидываются просто, после ресайза окна.
ufna
на вид и цикл - типичный grid.

И откуда взяться скроллу, если виджет-родитель у тебя размер нигде не меняет? ну пусть виджет 600х400, а внутри него его дитятке ты ставишь (800,800,10,10) - размер родителя не меняется.
RazrFalcon
Впихнул все QGraphicsView на виджет, виджет в скрол арию, виджет заведомо огромного размера. Толку 0. Для наглядности кинул mdiArea серую чтоб видно было сам виджет.
widget->setGeometry(100,100,width()+200,height()+200);
Раскрывающийся текст
Litkevich Yuriy
Цитата(RazrFalcon @ 14.8.2010, 20:28) *
QGridLayout не подходят
а чем не подходит? Судя по снимку экрана, оно и есть
RazrFalcon
Цитата(Litkevich Yuriy @ 14.8.2010, 17:54) *
Судя по снимку экрана, оно и есть

В том то и дело, что мне нужен аналог FlowLayout, они при изменении размера окна передвигаются. 2х5, 3х3+1 снизу и тд.
Проэкт прикрепил, думаю так будет быстрее чем объяснять.
Litkevich Yuriy
Цитата(RazrFalcon @ 14.8.2010, 22:23) *
что мне нужен аналог FlowLayout
а ты пробовал его использовать в своём проекте?
RazrFalcon
Цитата(Litkevich Yuriy @ 14.8.2010, 19:14) *
а ты пробовал его использовать в своём проекте?

Да, только он слишком громоздкий, а у меня всего то 10 строк. Так я еще и не понял как в него запихнуть QGraphicsView :rolleyes: , с кнопками и лейблами он справлялся у меня.
Litkevich Yuriy
Цитата(RazrFalcon @ 14.8.2010, 23:51) *
Так я еще и не понял как в него запихнуть QGraphicsView , с кнопками и лейблами он справлялся у меня.
это всё виджеты, метод там один и тот же addWidget

Цитата(RazrFalcon @ 14.8.2010, 23:51) *
а у меня всего то 10 строк.
и не работают ;)
компоновщик всегда возвращает свой желаемый размер, из-за это родительский виджет принимает меры по изменению своих размеров (для прокручиваемой области - QScrollArea, изменяется вид линейки прокрутки). А у тебя этого нет
RazrFalcon
Цитата(Litkevich Yuriy @ 14.8.2010, 19:57) *
это всё виджеты, метод там один и тот же addWidget
Да, но в примере оно то пашит, а в моей проге уже говорит:
QWidget::setLayout: Attempting to set QLayout "" on MainWindow "MainWindow", which already has a layout
и нечего не отображается, хоть и компилит.
Цитата
и не работают ;)
работает :) , только не в QScrollArea.
+
//так пашит
scrollArea->setWidget(new QGraphicsView);
//так уже не пашит
scrollArea->setWidget(new FlowLayout);
//или
scrollArea->setWidget(FlowLayout *flowLayout = new FlowLayout);
//так создаю, в примере FlowLayout этот способ пашит, но там нет формы.
flowLayout->addWidget(new QGraphicsView);
setLayout(flowLayout);
Litkevich Yuriy
Цитата(RazrFalcon @ 15.8.2010, 0:38) *
Да, но в примере оно то пашит, а в моей проге уже говорит:
как это будет по-русски?

Цитата(RazrFalcon @ 15.8.2010, 0:38) *
//так уже не пашит
scrollArea->setWidget(new FlowLayout);
а с чего оно так должно работать? этот метод называется "установитьВиджет", а ты устанавливаешь компоновщик
RazrFalcon
Цитата(Litkevich Yuriy @ 14.8.2010, 21:07) *
как это будет по-русски?
QWidget::setLayout: пытается установить QLayout "" на MainWindow "MainWindow", который уже имеет слой.
Только я все равно не вижу решение проблемы.
PS: QLayout "(так понимаю здесь должно что то быть)"
Litkevich Yuriy
Цитата(RazrFalcon @ 15.8.2010, 1:28) *
уже имеет слой.
не слой, а компоновщик (layout)

работа с компоновщиками описана в документации

схема простая:
некийКомпоновщик->добавитьВиджет(виджет_1)
некийКомпоновщик->добавитьВиджет(виджет_2)
некийКомпоновщик->добавитьВиджет(виджет_3)
некийВиджет->добавитьКомпоновщик(некийКомпоновщик)
ufna
Если у тебя QMainWindow родитель MainWindow класса, то ничего странного. Создай обычный виджет, ему присваивай лейаут, а в MainWindow делай setCentralWidget или чет такое.
RazrFalcon
Ну в общем прикрепил FlowLayout. Глупая конечно ошибка.
widget->setLayout(flowLayout);
Ну а виджет в скорол арию.
widget->setGeometry(0,0,width()+1000,height()+1000);
но скролы то так и не пашут!
Litkevich Yuriy
Цитата(RazrFalcon @ 15.8.2010, 21:33) *
Ну а виджет в скорол арию.
арию пусть в опере поют.
виджету нет необходимости устанавливать геометрию руками. В реальных программах этот приём почти не используется.
после после создания области прокрутки нужно просто установить её свойство widgetResizable в ИСТИНУ.
RazrFalcon
Цитата(Litkevich Yuriy @ 15.8.2010, 17:52) *
после создания области прокрутки нужно просто установить её свойство widgetResizable в ИСТИНУ.

Но у меня оно и так true. Изначально.
Litkevich Yuriy
приведи код от создания области прокрутки, до помещения первого из виджетов, которые ты хочешь чтобы в ней были.
RazrFalcon
Цитата(Litkevich Yuriy @ 15.8.2010, 18:27) *
приведи код от создания области прокрутки, до помещения первого из виджетов, которые ты хочешь чтобы в ней были.
widget в scrollAreа кидаю на форме.
FlowLayout *flowLayout = new FlowLayout;
flowLayout->addWidget(new QGraphicsView);
...
flowLayout->addWidget(new QGraphicsView);
widget->setLayout(flowLayout);
scrollArea->setWidgetResizable(true); //потом дописал, хотя на в свойствах в дизайнере стоит галочка.
//на ресайз окна
scrollArea->setGeometry(0,0,width()-100,height());
widget->setGeometry(0,0,width()+1000,height()+1000); //1000 пикс. чтоб наглядней было
в проект скинул flowlayout.h и flowlayout.cpp из примера.
ufna
можешь кинуть минимальный код на твою проблему?

попробуй не через setGeometry, а через resize(). Когда меняешь геометрию, если память не изменяет, никаких событий не возникает - скролл арея не будет догадываться что размеры виджета изменились (либо если он поменян насильно до добавления в арею, то во время добавления лейаут менеджер урежет до нужных ему размеров).
RazrFalcon
Цитата(ufna @ 15.8.2010, 23:39) *
попробуй не через setGeometry, а через resize().

Тоже не пашит. Проект ниже.
Litkevich Yuriy
widget в scrollAreа в дизайнере вообще не помещаем.
scrollArea->setWidgetResizable(true);
//
FlowLayout *flowLayout = new FlowLayout;
flowLayout->addWidget(new QGraphicsView);
...
flowLayout->addWidget(new QGraphicsView);
//
QWidget *widget = new QWidget();
widget->setLayout(flowLayout);
scrollArea->setWidget(widget);


RazrFalcon, все твои беды от того, что ты пытаешься размещать виджеты вручную. Я тебе уже говорил, что в реальных программах так не делают, без крайней нужды.
Да и вообще стиль плохой. Файл main.cpp отсутствует.

Нажмите для просмотра прикрепленного файла
RazrFalcon
Спасибо пашит. То есть все из-за того что я формой пользовался?! Хм...
В принципе она мне и не нужна практически никогда, так что буду теперь без нее.
Только не пойму в чем проблема с main.cpp?! В него ничего не помещают, он всегда одинаковый, и еще и отдельным фалом, таскать с собой вечно. Так почему бы просто его не в писать в главный .cpp . Не вижу проблемы, ну "кроме хорошего тона написания программы".
Litkevich Yuriy
Цитата(RazrFalcon @ 16.8.2010, 16:57) *
То есть все из-за того что я формой пользовался?!
если речь о дизайнере форм, то - нет

Цитата(RazrFalcon @ 16.8.2010, 16:57) *
Так почему бы просто его не в писать в главный .cpp
главный и есть main (переводится именно так)
RazrFalcon
Цитата(Litkevich Yuriy @ 16.8.2010, 13:43) *
главный и есть main (переводится именно так)
Это я понял, просто мне что с ним что без него как то одинаково. По крайней мере разницы не вижу. И так и так компилит.
PS перестал работать ресайз QGraphicsView. Все время одного размера появляются, стандартного.
for (int i=0;i<gv_count;i++)
{
    list.append(new QGraphicsView);
    list[i]->setGeometry(list[i]->x(),list[i]->y(),500, 100);
    flowLayout->addWidget(list[i]);
}
scrollAreaWidgetContents->setLayout(flowLayout);
Где б я не ставил setGeometry, оно или не работает, или просто все обекты сбиваются в одну позицию, что значит я не то сделал.
Алексей1153
RazrFalcon, возьми, сделай в редакторе форм то, что ты хочешь увидеть, а потом скомпилируй и посмотри содержимое Ui_MainWindow::setupUi
RazrFalcon
Цитата(Алексей1153 @ 16.8.2010, 18:14) *
посмотри содержимое Ui_MainWindow::setupUi

непонял... совсем! Мне нужно моим бесконечным QGraphicsView присвоить ширину и высоту, всем одинаковою, а flowLayout не дает.
Алексей1153
RazrFalcon, Ой, не знаю. Я бы не заморачивался с компоновщиками (если честно, я не понимаю смысла их существования даже при создании формы в редакторе) а просто разместил на главном окне там, где нужно. Правда, это у меня от MFC и WinAPI такие повадки остались, но, тем не менее это работает ))
RazrFalcon
Цитата(Алексей1153 @ 16.8.2010, 20:13) *
RazrFalcon, Ой, не знаю. Я бы не заморачивался с компоновщиками (если честно, я не понимаю смысла их существования даже при создании формы в редакторе)
Я тоже никогда ими не пользуюсь, только в данном случае без flowLayout не пашит скролбар, но и не меняется размер QGraphicsView. А без flowLayout меняется размер но скрол не пашит. Замкнутый круг какой то. Уже все перепробовал.
Litkevich Yuriy
Цитата(RazrFalcon @ 16.8.2010, 23:02) *
Мне нужно моим бесконечным QGraphicsView присвоить ширину и высоту, всем одинаковою
setFixedSize
сколько раз тебе говорить - не устанавливай руками геометрию. Геометрией ведает компоновщик
Алексей1153
Не могу понять связь скролбара с компоновщиком...
Например, я могу положить полосу прокрутки просто на форму - и она будет работать
Litkevich Yuriy
Цитата(Алексей1153 @ 17.8.2010, 0:58) *
Не могу понять связь скролбара с компоновщиком...
а о линейке прокрутки речь и не идёт. Речь идёт об области с прокруткой - виджет контейнер
RazrFalcon
Цитата(Litkevich Yuriy @ 16.8.2010, 20:56) *
setFixedSize, сколько раз тебе говорить - не устанавливай руками геометрию. Геометрией ведает компоновщик
Он ставит 260x190 QGraphicsView, а мне нужно то что я прописал. 350х100 к примеру. Как это сделать? Я то могу и просто скрол кинуть, но нужно ведь разобраться с этим.
Litkevich Yuriy
Цитата(RazrFalcon @ 17.8.2010, 1:50) *
Он ставит 260x190 QGraphicsView
он это кто? setFixedSize?
RazrFalcon
Цитата(Litkevich Yuriy @ 16.8.2010, 22:06) *
он это кто? setFixedSize?
flowLayout. Какие способы вообще есть поставить размеры в компоновщике?
Litkevich Yuriy
Цитата(RazrFalcon @ 17.8.2010, 2:11) *
Какие способы вообще есть поставить размеры в компоновщике?
размеры надо ставить виджету и я тебе уже написал название функции, читай Асистент!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.