Qlabel mit Bild in einem QWidget

Alles rund um die Programmierung mit Qt
Antworten
acdc
Beiträge: 82
Registriert: 23. Oktober 2007 18:56

Qlabel mit Bild in einem QWidget

Beitrag 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
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag von archer »

Hast du schon

Code: Alles auswählen

imageLabel->setScaledContents(true);
brobiert?
acdc
Beiträge: 82
Registriert: 23. Oktober 2007 18:56

Beitrag von acdc »

archer hat geschrieben:Hast du schon

Code: Alles auswählen

imageLabel->setScaledContents(true);
brobiert?
ja, steht schon oben im code!
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag 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.
acdc
Beiträge: 82
Registriert: 23. Oktober 2007 18:56

Beitrag 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
acdc
Beiträge: 82
Registriert: 23. Oktober 2007 18:56

Beitrag von acdc »

man könnte über QTimer das resize verzögern, aber ist das eine gute Idee?

Hat jemand eine andere Idee?

mfg acdc
softwaremaker
Beiträge: 149
Registriert: 1. April 2009 19:25

QDesktopWidget

Beitrag 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 )  );
acdc
Beiträge: 82
Registriert: 23. Oktober 2007 18:56

Beitrag von acdc »

Danke für den Anstoß - Problem gelöst!

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