Как установить начальный размер QScrollArea?

Я знаю, что это очень специфический вопрос, связанный с C++ и Qt, но, возможно, кто-то все равно может мне помочь...

См. код ниже: я хочу отобразить изображение в области прокрутки. Окно просмотра области прокрутки должно иметь определенный начальный размер. Это означает, что если размер изображения больше, чем начальный размер окна просмотра, полосы прокрутки будут видны, иначе нет.

// create label for displaying an image
QImage image( ":/test.png" );
QLabel *label = new QLabel( this );
label->setPixmap( image.toPixmap() );

// put label into scroll area
QScollArea *area = new QScrollArea( this );
area->setWidget( label );

// set the initial size of the view port
// NOTE: This is what I'd like to do, but this method does not exist :(
area->setViewPortSize( QSize( 300, 300 ) );

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

К сожалению, мне не удалось выяснить, как установить размер окна просмотра. Механизм макета Qt, кажется, устанавливает размер по умолчанию для порта просмотра, но до сих пор я не мог его изменить. Установка нового размера с помощью

area->setMinimumSize( QSize( 300, 300 ) );

фактически установит требуемый размер, но тогда область прокрутки потеряет возможность изменять размер до размера меньше 300x300.

Любые идеи?


person Thomas Koschel    schedule 27.10.2008    source источник


Ответы (6)


Мне кажется, вы неправильно смотрите на проблему. QScrollArea — это просто виджет, который вы помещаете во фрейм или QMainWindow. Размер виджета определяется компоновкой содержащего его виджета.

Взгляните на этот пример от Trolltech: Пример просмотра изображений

person Dusty Campbell    schedule 30.10.2008

Является ли область прокрутки виджетом верхнего уровня? Если да, просто позвоните

area->resize(300,300);

Если он находится внутри иерархии, вам необходимо соответствующим образом изменить размер верхнего уровня (сложный) или установить минимальный размер области. Вы также можете попробовать поэкспериментировать с LayoutPolicy — предполагая, что sizeHint равен QSize (300 300), вы можете задать ему соответствующую политику размера в соответствии с тем, что определено в https://doc.qt.io/qt-5/qsizepolicy.html#Policy-enum

person Henrik Hartz    schedule 02.01.2009

Можешь попробовать:

class MyScrollArea : public QScrollArea
{
    virtual QSize sizeHint() const { return QSize( 300, 300 ); }
};

// create label for displaying an image
QImage image( ":/test.png" );
Label *label = new QLabel;
label->setPixmap( image.toPixmap() );

// put label into scroll area
QScollArea *area = new MyScrollArea( this );
area->setWidget( label );

Однако макет и Qt удивительно вуду. ИМО его наименее функциональная часть.

если это не сработает, попробуйте вызвать QWidget::resize() для различных виджетов.

person mxcl    schedule 30.10.2008

Я не думаю, что вы можете сделать это очень легко, а именно (если я правильно читаю) изменить размер виджета так, чтобы внутренняя область была 300x300. Однако вы можете схитрить, так как область прокрутки — это тип фрейма, который наследуется от QWidget. Это означает, что вы можете просто вызвать area->resize( 300 + fudge, 300 + fudge ), где ваши вымышленные значения учитывают дополнительный бит, занимаемый рисунком фрейма.

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

person Caleb Huitt - cjhuitt    schedule 28.10.2008

Если вы пытаетесь отобразить изображение внутри области прокрутки, лучше всего не использовать метку.

Вы должны попробовать использовать QGraphicsView/QGraphicsScene/QGraphicPixmapItem (вместо области прокрутки и метки). Производительность намного лучше при отображении изображений. Область прокрутки и метка будут очень плохо перерисовывать изображение при перемещении с помощью полос прокрутки.

Например, у вас есть файл ".ui" с QGraphicsView в графическом интерфейсе с именем "qgvImageView" и QImage с именем "image"...

QGraphicsScene *scene = new QGraphicsScene(qgvImageView);
QPixmap pixTmp(QPixmap::fromImage(image));
QGraphicsPixmapItem * ppixItem = scene->addPixmap( pixTmp );
ppixItem->setPos(0,0);

Ознакомьтесь с документацией QT. Кстати: это было введено в Qt 4.2

Я не уверен, что это конкретно решит проблему, но есть шанс, что QGraphicsView лучше отреагирует на то, что вы пытаетесь сделать.

person Community    schedule 04.11.2008

Как насчет использования

area->setGeometry(int x, int y, int w, int h);
person Alpants    schedule 03.01.2009