Seite 1 von 1

Qlabel mit Bild in einem QWidget

Verfasst: 25. Februar 2010 22:55
von acdc
Hallo,

ich habe ein QWidget mit fixer größe und möchte nun ein Bild in diesem Widget anzeigen.

setFixedSize(200,200);
QVBoxLayout *layout=new QVBoxLayout(this);
setLayout(layout);
imageLabel=new QLabel(this);

imageLabel->setBackgroundRole(QPalette::Base);
imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
imageLabel->setScaledContents(true);

layout->addWidget(imageLabel);

QImage image(pfad);
imageLabel->setPixmap(QPixmap::fromImage(image));

Das Anzeigen funktioniert, nur möchte ich, dass das Widget immer die fixe größe beibehält und das Bild aber ein gesperrtes Seitenverhältnis hat.
Da sollte natürlich bei so manchen Bildern ein teil des Fensters grau bleiben.

Wie kann ich das nun einstellen, dass sich das Bild der größe des Widgets unterordnet aber nicht das Seitenverhältnis geändert wird?

mfg
acdc

Verfasst: 26. Februar 2010 07:49
von archer
Hast du schon

Code: Alles auswählen

imageLabel->setScaledContents(true);
brobiert?

Verfasst: 26. Februar 2010 07:56
von acdc
archer hat geschrieben:Hast du schon

Code: Alles auswählen

imageLabel->setScaledContents(true);
brobiert?
ja, steht schon oben im code!

Verfasst: 26. Februar 2010 08:10
von archer
Vielleicht selber das image auf die richtige Größe bringen.
in QImage oder auch in QPixmap gibt es die methode scaled(..);
Wenn sich dein Widget in der größe nie ändert, dann reicht es ja es beim Laden auf die richtige größe zu bringen.

Verfasst: 26. Februar 2010 13:25
von acdc
habs nun so probiert:

Code: Alles auswählen

void PictureWidget::setPicture(QString Path)
{
  path=Path;
  int w,h;
  QImage image(path);
  QDesktopWidget desktop;
  QRect rect=desktop.availableGeometry();
  imageLabel->setPixmap(QPixmap::fromImage(image));      
    
  if(image.width()>(rect.width()/2))
  {
    if((image.height()+10)>(rect.height()-100))
    {
      image=image.scaled(rect.width()-100,rect.height()-100,Qt::KeepAspectRatio,Qt::FastTransformation);
    }
    image=image.scaled(width(),image.height(),Qt::KeepAspectRatio,Qt::FastTransformation);
    w=width();
    h=image.height();

  }
  else
  {
    image=image.scaled(image.width(),image.height(),Qt::KeepAspectRatio,Qt::FastTransformation);
    w=image.width();
    h=image.height();
  }
  resize(w,h);
}
Da ich das Widget auch als freies Fenster und nicht in nur in einem Layout nutzen möchte, ist die setPicture Methode etwas länger. es werden zu große bilder verkleinert und das Widget angepasst usw.

Es funktioniert alles so wie gewünscht, nur eben nicht der oben genannte Punkt.Füge ich jedoch eine QMessagebox vor dem "resize(w,h)" ein so funktionierts.

Code: Alles auswählen

...
}
QMessageBox msgBox;
    msgBox.setText("browser");
    msgBox.exec();
resize(w,h);
}....
es liegt hier scheinbar an der Verzögerung durch die Messagebox. Was kann ich hier tun?

mfg
acdc

Verfasst: 27. Februar 2010 11:07
von acdc
man könnte über QTimer das resize verzögern, aber ist das eine gute Idee?

Hat jemand eine andere Idee?

mfg acdc

QDesktopWidget

Verfasst: 27. Februar 2010 19:20
von softwaremaker
Warum nutzt du auf einmal QDesktopWidget ?

wie wärs mit:

Code: Alles auswählen

ui->meinLabel->setPixmap(
            meinBild.scaledToWidth( ui->meinLabel->width(), Qt::SmoothTransformation )  );

Verfasst: 28. Februar 2010 09:18
von acdc
Danke für den Anstoß - Problem gelöst!

QDesktopWidget sagt mir die Größe des verfügbaren Bildschirms!