Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Чем скроллить кучу текста, кнопок, полей ввода?


Автор: gustavomarginale 17.5.2011, 22:17
Решение: создать большой виджет, напихать на него кучу других виджетов и запихнуть этот большой виджет в QScrollWidget. Под linux никаких проблем нет, но под windows qt ограничивает размер QWidget размером экрана, поэтому большой полотно с ништяками для засовывания в QScrollWidget создать не удаётся.

Как бы мне скроллить большое "полотно", утыканное кусками текста, кнопками и прочим? Нужно отобразить вертикальный список входящих сообщений наподобие форума, но в силу однообразности сообщений нецелесообразно применять ресурсоёмкий встроенный в Qt броузер. Поэтому нескольких вертикальных многострочных QLabel (многострочность которых, по иронии судьбы, будет обеспечена втыканием в текст HTML-тега <br>, а наличие внутри QLabel HTML-интерпретатора, от которого я так активно отпираюсь, позволяет ещё и цвета текста разные использовать) мне хватит.

На чём все эти ништяки рисовать, раз QWidget большой не может быть создан под windows? Есть ли что-то другое, что может быть большим, содержать "на себе" виджеты типа QLabel, QPushButton и быть скроллимым каким-нибудь скроллером? Или может написать свой QScrollWidget? Тогда как можно отображать кусочек этого чего-то (что мне ещё не посоветовали) большого с кнопками и текстами?

Спасибо.

Автор: borisbn 18.5.2011, 01:30
что такое QScrollWidget - не знаю. С http://doc.qt.nokia.com/latest/qscrollarea.html работает. под Windows
Код

Widget::Widget(QWidget *parent) :
    QWidget( parent ),
    ui( new Ui::Widget )
{
    ui->setupUi( this );

    QWidget * w = new QWidget( this );
    w->resize( 1000, 2000 );
    QScrollArea * sa = new QScrollArea( this );
    ui->gridLayout->addWidget( sa );
    sa->setWidget( w );
}

Автор: gustavomarginale 18.5.2011, 10:46
Цитата(borisbn @ 18.5.2011,  01:30)
что такое QScrollWidget - не знаю. С http://doc.qt.nokia.com/latest/qscrollarea.html работает. под Windows
Код

Widget::Widget(QWidget *parent) :
    QWidget( parent ),
    ui( new Ui::Widget )
{
    ui->setupUi( this );

    QWidget * w = new QWidget( this );
    w->resize( 1000, 2000 );
    QScrollArea * sa = new QScrollArea( this );
    ui->gridLayout->addWidget( sa );
    sa->setWidget( w );
}


Да, имелся ввиду QScrollArea.

Смотрите какая история под windows:

Код

QWidget *x = new QWidget();
x -> resize ( 1000, 2000 );
std::cout << "::: " << x->width() << ", " << x->height() << "\n";
x->resize(1000, 4000);
std::cout << "::: " << x->width() << ", " << x->height() << "\n";
x->show();
std::cout << "::: " << x->width() << ", " << x->height() << "\n";


Вывод:
::: 1000, 2000
::: 1000, 4000
::: 1000, 1035

Автор: borisbn 18.5.2011, 11:03
да, есть такое, но только, если widget - топовое окно. если же он лежит в scrollArea - то всё в порядке
Код

Widget::Widget(QWidget *parent) :
    QWidget( parent ),
    ui( new Ui::Widget )
{
    ui->setupUi( this );

    QWidget * w = new QWidget( this );
    w->resize( 1000, 2000 );
    QScrollArea * sa = new QScrollArea( this );
    ui->gridLayout->addWidget( sa );
    sa->setWidget( w );
    qDebug() << "::: " << w->width() << ", " << w->height() << "\n";    
}

Цитата

:::  1000 ,  2000 

Автор: gustavomarginale 18.5.2011, 11:44
Значит причина в доставании виджета из QScrollArea. Его нельзя "достать-запихнуть" после того, как единожды его туда засунул. Странно.

Код

QWidget *x = new QWidget();
x -> resize ( 1000, 2000 );
std::cout << "::: " << x->width() << ", " << x->height() << "\n";
x->resize(1000, 4000);
std::cout << "::: " << x->width() << ", " << x->height() << "\n";

QScrollArea *s = new QScrollArea();
s -> setWidget(x);
s->show();
std::cout << "::: " << x->width() << ", " << x->height() << "\n";
s->takeWidget();
s->setWidget(x);
std::cout << "::: " << x->width() << ", " << x->height() << "\n";


::: 1000, 2000
::: 1000, 4000
::: 1000, 4000
::: 1000, 1035

Автор: borisbn 18.5.2011, 12:44
Цитата(gustavomarginale @  18.5.2011,  11:44 Найти цитируемый пост)
Его нельзя "достать-запихнуть" после того, как единожды его туда засунул

А надо ? Или это уже чисто спортивный интерес ?

Автор: gustavomarginale 18.5.2011, 13:43
Цитата(borisbn @ 18.5.2011,  12:44)
Цитата(gustavomarginale @  18.5.2011,  11:44 Найти цитируемый пост)
Его нельзя "достать-запихнуть" после того, как единожды его туда засунул

А надо ? Или это уже чисто спортивный интерес ?

Не надо. Спортивный. Научный.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)