Pergunta

Eu sei que este é um C muito específico ++ e Qt questão relacionada, mas talvez alguém possa me ajudar, de qualquer maneira ...

Veja o código abaixo: Eu quero mostrar uma imagem dentro de uma área de rolagem. A porta de vista da área de deslocamento deve ter um tamanho inicial definido. Isso significa que, se o tamanho da imagem é maior do que o tamanho inicial do porto vista, barras de rolagem será visível, caso contrário não.

// 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 ) );

Deve ser possível redimensionar toda a aplicação para que o porto vista terá outra dimensão do que a inicial.

Infelizmente não fui capaz de descobrir, como definir o tamanho do porto vista. mecanismo de layout do Qt parece definir um tamanho padrão para a porta vista, mas até agora não foi capaz de mudá-lo. Estabelecendo um novo tamanho com

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

vai realmente definir o tamanho exigido, mas, em seguida, a área de rolagem perde a capacidade de se redimensionada para um tamanho menor do que 300x300.

Todas as idéias?

Foi útil?

Solução

Eu acho que você está olhando para o problema da maneira errada. O QScrollArea é apenas um widget que você colocar em um quadro ou QMainWindow. O tamanho do widget é controlado pelo layout do widget que o contém.

Dê uma olhada neste exemplo da Trolltech: Image Viewer exemplo

Outras dicas

É a área de deslocamento do widget de nível superior? Se assim for, basta ligar

area->resize(300,300);

Se é dentro de uma hierarquia que você precisa para redimensionar a toplevel apropriadamente (complexo), ou definir o MinimumSize da área. Você também pode tentar experimentar com o LayoutPolicy - assumindo o sizeHint é QSize (300.300), você pode dar-lhe a política de tamanho adequado de acordo com o que está definido na https://doc.qt.io/qt-5/qsizepolicy.html#Policy-enum

Você pode tentar:

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 );

No entanto layout e Qt é incrivelmente Voodoo. É IMO sua parte menos funcional.

Se isso não funcionar, tente chamar QWidget :: resize () em vários widgets.

Eu não acho que você pode fazer exatamente isso muito facilmente, o que é (se eu estou lendo corretamente), o tamanho do widget para que a área interna é 300x300. Você pode ser capaz de falsificar, no entanto, uma vez que uma área de rolagem é um tipo de quadro, que herda de QWidget. Isto significa que você poderia simplesmente chamar area->resize( 300 + fudge, 300 + fudge ), onde seus valores fudge conta para o bit extra ocupado por desenho do quadro.

Eu não estou certo de que este iria funcionar em um diálogo dinâmico redimensionável, no entanto. Eu não tenho feito nada parecido.

Se você está tentando exibir uma imagem dentro de uma área de rolagem, a sua melhor aposta é não ir com uma etiqueta.

Você deve tentar usar um QGraphicsView / QGraphicsScene / QGraphicPixmapItem (em vez da área de deslocamento e etiqueta). O desempenho é muito melhor ao exibir imagens. A área de rolagem e etiqueta vai re-desenhar a imagem muito mal como você se move em torno de usar as barras de rolagem.

Por exemplo, você tem um ".ui" arquivo com um QGraphicsView na gui chamada 'qgvImageView' e um QImage chamado de 'imagem' ...

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

Confira a documentação QT. BTW: Isto foi introduzido no Qt 4.2

Eu não tenho certeza se isso vai especificamente resolver o problema, mas há uma chance de que o QGraphicsView vai reagir melhor ao que você está tentando fazer.

Que tal usar

area->setGeometry(int x, int y, int w, int h);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top