RazrFalcon
13.8.2010, 21:30
Такая вот проблема, вниз этих QGraphicsView уходит еще с 10-ок, но что б я не делал скролы не реагируют никак.
Скрол бары выставлены в примере "показывать всегда", так как если выставить "показывать при необходимости" то они просто не появляются.
Пробовал управлять баром отдельно и через создание QVBoxLayout с QGraphicsView, ничего.
Добавляю так:
for(int i=0;i<gv_count;i++)
{
list.append(new QGraphicsView(scrollArea));
//list.append(new QGraphicsView(scrollAreaWidgetContents));
}
Litkevich Yuriy
13.8.2010, 21:41
а как ты управляешь размещением виджетов внутри QScrollArea?
RazrFalcon
13.8.2010, 21:58
Цитата(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
13.8.2010, 22:42
Цитата(RazrFalcon @ 14.8.2010, 1:58)
Всмысле?
в прямом, ты их помещаешь в компоновщик установленный для QScrollArea?
RazrFalcon
13.8.2010, 23:42
Цитата(Litkevich Yuriy @ 13.8.2010, 22:42)
ты их помещаешь в компоновщик установленный для QScrollArea?
Я не понимаю.
Какой компоновщик, QVBoxLayout что ли, если да то на него а его потом в арию. А вообще, просто все QGraphicsView скидываю в Арию и каждому задаю позицию внутри.
Litkevich Yuriy
14.8.2010, 0:23
Цитата(RazrFalcon @ 14.8.2010, 3:42)
Какой компоновщик, QVBoxLayout что ли
ну хотябы его, но судя по снимку экрана должен быть QGridLayout
Приведи эту часть кода (компоновка области прокрутки)
RazrFalcon
14.8.2010, 16:28
Litkevich Yuriy, В том то и дело что QVBoxLayout и QGridLayout не подходят, я в 3-м сообщении привел код, там циклом раскидываются просто, после ресайза окна.
на вид и цикл - типичный grid.
И откуда взяться скроллу, если виджет-родитель у тебя размер нигде не меняет? ну пусть виджет 600х400, а внутри него его дитятке ты ставишь (800,800,10,10) - размер родителя не меняется.
RazrFalcon
14.8.2010, 17:00
Впихнул все QGraphicsView на виджет, виджет в скрол арию, виджет заведомо огромного размера. Толку 0. Для наглядности кинул mdiArea серую чтоб видно было сам виджет.
widget->setGeometry(100,100,width()+200,height()+200);
Litkevich Yuriy
14.8.2010, 17:54
Цитата(RazrFalcon @ 14.8.2010, 20:28)
QGridLayout не подходят
а чем не подходит? Судя по снимку экрана, оно и есть
RazrFalcon
14.8.2010, 18:23
Цитата(Litkevich Yuriy @ 14.8.2010, 17:54)
Судя по снимку экрана, оно и есть
В том то и дело, что мне нужен аналог FlowLayout, они при изменении размера окна передвигаются. 2х5, 3х3+1 снизу и тд.
Проэкт прикрепил, думаю так будет быстрее чем объяснять.
Litkevich Yuriy
14.8.2010, 19:14
Цитата(RazrFalcon @ 14.8.2010, 22:23)
что мне нужен аналог FlowLayout
а ты пробовал его использовать в своём проекте?
RazrFalcon
14.8.2010, 19:51
Цитата(Litkevich Yuriy @ 14.8.2010, 19:14)
а ты пробовал его использовать в своём проекте?
Да, только он слишком громоздкий, а у меня всего то 10 строк. Так я еще и не понял как в него запихнуть QGraphicsView
, с кнопками и лейблами он справлялся у меня.
Litkevich Yuriy
14.8.2010, 19:57
Цитата(RazrFalcon @ 14.8.2010, 23:51)
Так я еще и не понял как в него запихнуть QGraphicsView , с кнопками и лейблами он справлялся у меня.
это всё виджеты, метод там один и тот же addWidget
Цитата(RazrFalcon @ 14.8.2010, 23:51)
а у меня всего то 10 строк.
и не работают
компоновщик всегда возвращает свой желаемый размер, из-за это родительский виджет принимает меры по изменению своих размеров (для прокручиваемой области - QScrollArea, изменяется вид линейки прокрутки). А у тебя этого нет
RazrFalcon
14.8.2010, 20:38
Цитата(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
14.8.2010, 21:07
Цитата(RazrFalcon @ 15.8.2010, 0:38)
Да, но в примере оно то пашит, а в моей проге уже говорит:
как это будет по-русски?
Цитата(RazrFalcon @ 15.8.2010, 0:38)
//так уже не пашит
scrollArea->setWidget(new FlowLayout);
а с чего оно так должно работать? этот метод называется "установитьВиджет", а ты устанавливаешь компоновщик
RazrFalcon
14.8.2010, 21:28
Цитата(Litkevich Yuriy @ 14.8.2010, 21:07)
как это будет по-русски?
QWidget::setLayout: пытается установить QLayout "" на MainWindow "MainWindow", который уже имеет слой.Только я все равно не вижу решение проблемы.
PS: QLayout "(так понимаю здесь должно что то быть)"
Litkevich Yuriy
15.8.2010, 3:03
Цитата(RazrFalcon @ 15.8.2010, 1:28)
уже имеет слой.
не слой, а компоновщик (layout)
работа с компоновщиками
описана в документациисхема простая:
некийКомпоновщик->добавитьВиджет(виджет_1)
некийКомпоновщик->добавитьВиджет(виджет_2)
некийКомпоновщик->добавитьВиджет(виджет_3)
некийВиджет->добавитьКомпоновщик(некийКомпоновщик)
Если у тебя QMainWindow родитель MainWindow класса, то ничего странного. Создай обычный виджет, ему присваивай лейаут, а в MainWindow делай setCentralWidget или чет такое.
RazrFalcon
15.8.2010, 17:33
Ну в общем прикрепил FlowLayout. Глупая конечно ошибка.
widget->setLayout(flowLayout);
Ну а виджет в скорол арию.
widget->setGeometry(0,0,width()+1000,height()+1000);
но скролы то так и не пашут!
Litkevich Yuriy
15.8.2010, 17:52
Цитата(RazrFalcon @ 15.8.2010, 21:33)
Ну а виджет в скорол арию.
арию пусть в опере поют.
виджету нет необходимости устанавливать геометрию руками. В реальных программах этот приём почти не используется.
после после создания области прокрутки нужно просто установить её свойство
widgetResizable в ИСТИНУ.
RazrFalcon
15.8.2010, 18:05
Цитата(Litkevich Yuriy @ 15.8.2010, 17:52)
после создания области прокрутки нужно просто установить её свойство widgetResizable в ИСТИНУ.
Но у меня оно и так true. Изначально.
Litkevich Yuriy
15.8.2010, 18:27
приведи код от создания области прокрутки, до помещения первого из виджетов, которые ты хочешь чтобы в ней были.
RazrFalcon
15.8.2010, 19:42
Цитата(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 из примера.
можешь кинуть минимальный код на твою проблему?
попробуй не через setGeometry, а через resize(). Когда меняешь геометрию, если память не изменяет, никаких событий не возникает - скролл арея не будет догадываться что размеры виджета изменились (либо если он поменян насильно до добавления в арею, то во время добавления лейаут менеджер урежет до нужных ему размеров).
RazrFalcon
16.8.2010, 2:23
Цитата(ufna @ 15.8.2010, 23:39)
попробуй не через setGeometry, а через resize().
Тоже не пашит. Проект ниже.
Litkevich Yuriy
16.8.2010, 4:35
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
16.8.2010, 12:57
Спасибо пашит. То есть все из-за того что я формой пользовался?! Хм...
В принципе она мне и не нужна практически никогда, так что буду теперь без нее.
Только не пойму в чем проблема с main.cpp?! В него ничего не помещают, он всегда одинаковый, и еще и отдельным фалом, таскать с собой вечно. Так почему бы просто его не в писать в главный .cpp . Не вижу проблемы, ну "кроме хорошего тона написания программы".
Litkevich Yuriy
16.8.2010, 13:43
Цитата(RazrFalcon @ 16.8.2010, 16:57)
То есть все из-за того что я формой пользовался?!
если речь о дизайнере форм, то - нет
Цитата(RazrFalcon @ 16.8.2010, 16:57)
Так почему бы просто его не в писать в главный .cpp
главный и есть
main (переводится именно так)
RazrFalcon
16.8.2010, 16:47
Цитата(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
16.8.2010, 18:14
RazrFalcon, возьми, сделай в редакторе форм то, что ты хочешь увидеть, а потом скомпилируй и посмотри содержимое Ui_MainWindow::setupUi
RazrFalcon
16.8.2010, 19:02
Цитата(Алексей1153 @ 16.8.2010, 18:14)
посмотри содержимое Ui_MainWindow::setupUi
непонял... совсем! Мне нужно моим бесконечным QGraphicsView присвоить ширину и высоту, всем одинаковою, а flowLayout не дает.
Алексей1153
16.8.2010, 20:13
RazrFalcon, Ой, не знаю. Я бы не заморачивался с компоновщиками (если честно, я не понимаю смысла их существования даже при создании формы в редакторе) а просто разместил на главном окне там, где нужно. Правда, это у меня от MFC и WinAPI такие повадки остались, но, тем не менее это работает ))
RazrFalcon
16.8.2010, 20:54
Цитата(Алексей1153 @ 16.8.2010, 20:13)
RazrFalcon, Ой, не знаю. Я бы не заморачивался с компоновщиками (если честно, я не понимаю смысла их существования даже при создании формы в редакторе)
Я тоже никогда ими не пользуюсь, только в данном случае без flowLayout не пашит скролбар, но и не меняется размер QGraphicsView. А без flowLayout меняется размер но скрол не пашит. Замкнутый круг какой то. Уже все перепробовал.
Litkevich Yuriy
16.8.2010, 20:56
Цитата(RazrFalcon @ 16.8.2010, 23:02)
Мне нужно моим бесконечным QGraphicsView присвоить ширину и высоту, всем одинаковою
setFixedSize
сколько раз тебе говорить - не устанавливай руками геометрию. Геометрией ведает компоновщик
Алексей1153
16.8.2010, 20:58
Не могу понять связь скролбара с компоновщиком...
Например, я могу положить полосу прокрутки просто на форму - и она будет работать
Litkevich Yuriy
16.8.2010, 21:34
Цитата(Алексей1153 @ 17.8.2010, 0:58)
Не могу понять связь скролбара с компоновщиком...
а о линейке прокрутки речь и не идёт. Речь идёт об области с прокруткой - виджет контейнер
RazrFalcon
16.8.2010, 21:50
Цитата(Litkevich Yuriy @ 16.8.2010, 20:56)
setFixedSize, сколько раз тебе говорить - не устанавливай руками геометрию. Геометрией ведает компоновщик
Он ставит 260x190 QGraphicsView, а мне нужно то что я прописал. 350х100 к примеру. Как это сделать? Я то могу и просто скрол кинуть, но нужно ведь разобраться с этим.
Litkevich Yuriy
16.8.2010, 22:06
Цитата(RazrFalcon @ 17.8.2010, 1:50)
Он ставит 260x190 QGraphicsView
он это кто? setFixedSize?
RazrFalcon
16.8.2010, 22:11
Цитата(Litkevich Yuriy @ 16.8.2010, 22:06)
он это кто? setFixedSize?
flowLayout. Какие способы вообще есть поставить размеры в компоновщике?
Litkevich Yuriy
16.8.2010, 23:14
Цитата(RazrFalcon @ 17.8.2010, 2:11)
Какие способы вообще есть поставить размеры в компоновщике?
размеры надо ставить виджету и я тебе уже написал название функции, читай Асистент!
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.