Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: kobra от Ноябрь 16, 2010, 01:41



Название: Не могу добавить скрол
Отправлено: kobra от Ноябрь 16, 2010, 01:41
Есть у меня виджет, в нем со временем могут появляться новые кнопки и формы. Как добавить скрол в етот виджет?

И второй вопрос: Есть у меня главное окно, как можна пересилать события(нажатия клавиш) к его активному дочерному окну(QDockWidget)?


Название: Re: Не могу добавить скрол
Отправлено: Пантер от Ноябрь 16, 2010, 08:16
QScrollArea


Название: Re: Не могу добавить скрол
Отправлено: kobra от Ноябрь 16, 2010, 22:55
Сделал так:
В конструкторе виджета прописал следующее:
Код:
QScrollArea *area = new QScrollArea(this);
Елементі виджета создаю к примеру так:
Код:
lengthLabel = new QLabel(this);
lengthLabel->setGeometry(QRect(5,30,100,20));
Результат на скриншоте


Название: Re: Не могу добавить скрол
Отправлено: Mashkovd от Ноябрь 17, 2010, 02:25
поддерживаю вопрос
у меня тоже была такая проблема(до сих пор не решена).

добавлял динамически лабел в виджет, у которого привязан скролареа.
Скролареа не появлялся, когда лабелы вылезали за размеры виджета.


Название: Re: Не могу добавить скрол
Отправлено: ufna от Ноябрь 17, 2010, 02:32
Ну дак а что такое QScrollArea то? В Вашем случае - скролл не содержит этот виджет, а лежит на нем.


Название: Re: Не могу добавить скрол
Отправлено: kobra от Ноябрь 17, 2010, 10:59
а можете написать как должно бить на самом деле?
Я пробовал так:
Код:
    QScrollArea *area = new QScrollArea();
    area->setWidget(this);
тогда окна вообще нет. Пробовал сделать так:
Код:
area->show();
тогда окно есть но пустое.


Название: Re: Не могу добавить скрол
Отправлено: GreatSnake от Ноябрь 17, 2010, 11:26
А что описание QScrollArea в ассистенте или здесь (http://doc.trolltech.com/4.7/qscrollarea.html#details) не судьба посмотреть?

Цитировать
lengthLabel->setGeometry(QRect(5,30,100,20));
Никогда! не делайте так. Пользуйтесь компоновщиками.
Про компоновку смотрим здесь (http://doc.crossplatform.ru/qt/4.6.x/layout.html).


Название: Re: Не могу добавить скрол
Отправлено: kobra от Ноябрь 17, 2010, 18:30
Я смотрел но надеялся что можна справиться без Layout, а то мне чесно говоря с ними очень тяжело работать.


Название: Re: Не могу добавить скрол
Отправлено: kobra от Ноябрь 18, 2010, 00:57
тогда вопрос о QFormLayout.
Как из него можна удалить строку?

PS Смотрите у меня для каждой строки есть: поле ввода, список и три кнопки, причем не обязательно что все три кнопки активные.
Я все виджеты обьединил в один. Внутри этого виджета они разместил с помощью QHBoxLayout. Потом в главном окне все разместил с помощью QFormLayout. Получилось что-то совсем плохое.
Можна ли как то задать дистанцию между елементами, их размеры и как можна сделать, если я прячу елемент место под него оставлялось?


Название: Re: Не могу добавить скрол
Отправлено: GreatSnake от Ноябрь 18, 2010, 09:04
Используйте лучше QGridLayout.
Для кнопок выставляйте QSizePolicy::Fixed.
Элементы можно не прятать, а просто их задизейблить.


Название: Re: Не могу добавить скрол
Отправлено: kobra от Ноябрь 18, 2010, 14:40
Используйте лучше QGridLayout.
Для кнопок выставляйте QSizePolicy::Fixed.
Элементы можно не прятать, а просто их задизейблить.
1. QGridLayout вместо чего?
2. Тогда нужно и размер кнопок указать?
3. А прятать не получиться? Так просто лучше смотриться


Название: Re: Не могу добавить скрол
Отправлено: kobra от Ноябрь 20, 2010, 19:53
итак все переделал под QGridLayout. Тогда почти автоматически решилась проблема с елементом что исчезает.
Можна ли сделать так чтоб QGridLayout раставлял виджеты не относительно середины окна, а относительно верхней части и левой стороны. А то когда я меняю количество шаров и у меня появляються новые поля все двигаеться что очень неудобно.

И как тепер мне добавить туда скрол? Если делаю так:
Код:
QScrollArea *ar = new QScrollArea();
this->setLayout(GridLayout);
ar->setWidget(this);
то скрола нет.

И второй вопрос: Есть у меня главное окно, как можна пересилать события(нажатия клавиш) к его активному дочерному окну(QDockWidget)?
и что насчет етого вопроса?


Название: Re: Не могу добавить скрол
Отправлено: kobra от Ноябрь 22, 2010, 20:32
Все с расстановкой разобрался. Действительно QGridLayout хорошая штука, если посидеть и помучаться с ней несколько дней.

Но скрола нет и ничего не могу сделать с етим. Я даже пробовал свой виджет унаследовать от QScrollAreaWidget но тогда не появляеться полоса прокрутки, а просто все уменшаеться в размерах чтоб поместиться в мой виджет.


Название: Re: Не могу добавить скрол
Отправлено: GreatSnake от Ноябрь 22, 2010, 20:46
Давай код.


Название: Re: Не могу добавить скрол
Отправлено: kobra от Ноябрь 22, 2010, 20:59
Код:
WindowData::WindowData():QScrollArea(){
    GridLayout = new QGridLayout();
    this->setLayout(GridLayout);
    setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    GridLayout->setAlignment(Qt::AlignTop);

    QLabel *QuantityLabel, *LengthLabel, *WidthLabel;

// ...

    GridLayout->addWidget(QuantityLabel,0,0);
    GridLayout->addWidget(QuantityField,0,1);
    GridLayout->addWidget(LengthLabel,1,0);
}
и етот виджет я вставляю в главном окне:
Код:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
dockWidgetB->setWidget(WindowData::getInstance()); // Возвращает указатель на клас
}


Название: Re: Не могу добавить скрол
Отправлено: ufna от Ноябрь 22, 2010, 22:28
Не, ну это, документацию читают только ламеры, да?

Самый первый пример (http://doc.qt.nokia.com/4.2/qscrollarea.html#details)


Название: Re: Не могу добавить скрол
Отправлено: kobra от Ноябрь 23, 2010, 00:15
Не, ну это, документацию читают только ламеры, да?

Самый первый пример (http://doc.qt.nokia.com/4.2/qscrollarea.html#details)
сомневаюсь, потому что я тоже ее читал, а я себя ламером не считаю.

я ничего против документации по qt не иею, но считаю что о скролах там написано плохо. Что из етого примера можна поонять? Ничего!!! Они сделали setWidget и у них все заработало. А как сделать чтоб содержимое виджета прокручивалось? Там только описано как ето сделать без примера, и если так делать то у меня почти работает(если указать мин. размер виджета), но когда я вставляю виджет как DockWidget оно работать перестает.


Название: Re: Не могу добавить скрол
Отправлено: ufna от Ноябрь 23, 2010, 01:48
Если с английским совсем плохо, то есть гугл транслятор как пример. Там же черным по белому написано:

Цитировать
A scroll area is used to display the contents of a child widget within a frame. If the widget exceeds the size of the frame, the view can provide scroll bars so that the entire area of the child widget can be viewed. The child widget must be specified with setWidget()

Или это у меня спец. допуск к тайной информации? :)


Название: Re: Не могу добавить скрол
Отправлено: kobra от Ноябрь 23, 2010, 03:15
что здесь имееться в виду под дочерним виджетом? тот которой я хочу вставить в DockWidget? Если да то ar->setWidget(this); делал уже не раз в итоге получал только то что иногда в окне у меня в дочернем окне пропадало названия


Название: Re: Не могу добавить скрол
Отправлено: ufna от Ноябрь 23, 2010, 03:43
dock widget <- scroll area <- your data widget

иерархия. В док виджет ты кидаешь виджет скролл арею, которой дитем назначаешь виджет с твоим содержимым, которое должно скроллится.

setWidget(this) не имеет смысла, т.к. setWidget(..) sets child widget.


Название: Re: Не могу добавить скрол
Отправлено: GreatSnake от Ноябрь 23, 2010, 09:12
Мде, слов нет...

Цитировать
сомневаюсь, потому что я тоже ее читал, а я себя ламером не считаю.
Своим упорством невнимательного чтения документации вы доказываете обратное.
Вам же ДВА! раза давалась ссылка (http://doc.trolltech.com/4.7/qscrollarea.html#details) с примером:
Код
C++ (Qt)
QLabel *imageLabel = new QLabel;
QImage image("happyguy.png");
imageLabel->setPixmap(QPixmap::fromImage(image));
 
scrollArea = new QScrollArea;
scrollArea->setBackgroundRole(QPalette::Dark);
scrollArea->setWidget(imageLabel);
Где вы видите установку лейаута на QScrollArea?

Вот правка вашего кода:
Код
C++ (Qt)
WindowData::WindowData():QScrollArea(){
   QWidget* base = new QWidget( this );
   setWidget( base );
   GridLayout = new QGridLayout( base );
   setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
   setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
   GridLayout->setAlignment(Qt::AlignTop);
 
   QLabel *QuantityLabel, *LengthLabel, *WidthLabel;
 
// ...
 
   GridLayout->addWidget(QuantityLabel,0,0);
   GridLayout->addWidget(QuantityField,0,1);
   GridLayout->addWidget(LengthLabel,1,0);
}


Название: Re: Не могу добавить скрол
Отправлено: kobra от Ноябрь 23, 2010, 14:24
нужно еще переписать resizeEvent для виджета? чтоб размер base менялся вместе с размером моего QScrollArea?


Название: Re: Не могу добавить скрол
Отправлено: GreatSnake от Ноябрь 23, 2010, 21:50
Цитировать
нужно еще переписать resizeEvent для виджета? чтоб размер base менялся вместе с размером моего QScrollArea?
А какой смысл тогда использовать QScrollArea?


Название: Re: Не могу добавить скрол
Отправлено: kobra от Ноябрь 24, 2010, 14:01
Потому что когда я сделал так как вы написали у меня ничего не отображаеться. Потом я делаю 
base->setMinimumSize(300,500);
И все хорошо когда у меня мало строк. Но когда я увеличиваю их количество то они снова накладаються друг на друга. Или мне нужно увеличивать у уменшать размер base когда я меняю количество строк?


Название: Re: Не могу добавить скрол
Отправлено: GreatSnake от Ноябрь 24, 2010, 14:21
Мде, ну никак человек не хочет читать документацию :(

Код
C++ (Qt)
#include <QApplication>
#include <QScrollArea>
#include <QLabel>
#include <QLineEdit>
#include <QGridLayout>
 
int main( int argc, char* argv[] )
{
QApplication app( argc, argv );
QScrollArea sa;
 
QWidget base( &sa );
sa.setWidget( &base );
 
QGridLayout l( &base );
 
for( int i = 0; i < 100; i++ )
{
l.addWidget( new QLabel( QString( "%1:" ).arg( i + 1 ) ), i, 0, Qt::AlignRight );
l.addWidget( new QLineEdit(), i, 1, 1, 20 );
}
 
#if 1 // сам выбирай, что тебе больше нравится
sa.setWidgetResizable( true );
#else
base.adjustSize();
#endif
 
sa.show();
return app.exec();
}
 


Название: Re: Не могу добавить скрол
Отправлено: kobra от Ноябрь 24, 2010, 19:52
Код:
	QWidget base( &sa );
sa.setWidget( &base );
вопрос какая разница между етими строками? Она разве не равноценні?


Название: Re: Не могу добавить скрол
Отправлено: GreatSnake от Ноябрь 24, 2010, 21:02
Нет.
Первая задаёт родителя для нового объекта.
Вторая указывает какой виджет будет прокручиваться.


Название: Re: Не могу добавить скрол
Отправлено: kobra от Декабрь 03, 2010, 20:25
сегодня нашел один странный глюк. Когда мой QDockWidget в начале запуска программы не активен(а активна вкладка другого QDockWidget) и потом открыть первый, то все его виджеты в одном месте. Скрин ниже:


Название: Re: Не могу добавить скрол
Отправлено: kobra от Декабрь 06, 2010, 19:22
нет идей?