Вопрос

Я знаю, что это очень специфический вопрос, связанный с 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.

Есть идеи?

Это было полезно?

Решение

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

Посмотрите на этот пример из Trolltech: Просмотрщик изображений Пример

Другие советы

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

area->resize(300,300);

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

Вы можете попробовать:

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 удивительно вуду. Это IMO его наименее функциональная часть.

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

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

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

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

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

Например, у вас есть " .ui " файл с QGraphicsView в графическом интерфейсе под названием «qgvImageView» и QImage под названием «изображение» ...

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

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

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

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

area->setGeometry(int x, int y, int w, int h);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top