2012-06-06 7 views
1

Я хочу показать изображение в своем приложении. Я использую QtDesigner для разработки пользовательского интерфейса, а затем используйте pyqt для кодирования. Проблема заключается в том, что изображение, которое будет отображаться, больше, чем размер виджета в пользовательском интерфейсе. Я имею в виду OFFICAL демо: QT - Widget Image Viewer DemoPyQt/Qt: Как растянуть изображение в Qlabel widget?

добавить imagelabel и ScrollArea, код следующим образом:

---- UI init ---- 
self.label = QtGui.QLabel(self.centralwidget) 
self.label.setGeometry(QtCore.QRect(40, 140, 361, 511)) 
self.label.setSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred) 
self.label.setObjectName(_fromUtf8("label")) 
self.scrollArea = QtGui.QScrollArea(self.centralwidget) 
self.scrollArea.setGeometry(QtCore.QRect(40, 140, 361, 511)) 
self.scrollArea.setWidget(self.label) 
self.scrollArea.setObjectName(_fromUtf8("scrollArea")) 

---- function ---- 
filename = "./Penguins.jpg" 
image = QtGui.QImage(filename) 
pp = QtGui.QPixmap.fromImage(image) 
lbl = QtGui.QLabel(self.label) 
lbl.setPixmap(pp) 
self.scrollArea.setWidgetResizable(True) 
lbl.show() 

но не растягивать изображение, даже не полоса прокрутки не появится!

ответ

10

Необходимо позвонить по телефону self.label.setScaledContents(true);. Так что QLabel будет изменять размер изображения в формате pixmap/image, и полоса прокрутки станет видимой. См. Это documentation.

+0

добавляет «self.label.setScaledContents (правда) «в моем коде, но он все еще не работает! Вы можете увидеть мой код выше, я установил размер scrollArea с размером метки. Это проблема? – whuiscool

+0

Я решил это! С отладкой я обнаружил, что «lbl = QtGui.QLabel (self.label) « неправ. – whuiscool

0

Я не использую PyQt, но элемент управления QtPixmap имеет функции масштабирования(). Вы можете изменить размер изображения, прежде чем положить на этикетке:

  • масштабируется()
  • scaledToHeight()
  • scaledToWidth()

Это пример кода я использую в C++, чтобы изменить размер изображение размером QLabel:

реализации
imatge.load("sprite.png"); 
QPixmap imatge2 = imatge.scaled(ui->label->width(),ui->label->height()); 
+0

Как вы можете установить размер вашего ярлыка и размер прокруткиArea? Вы можете увидеть мой код выше, я установил размер scrollArea с размером метки. Это проблема? – whuiscool

+0

Я решил это! С помощью отладки я обнаружил, что «lbl = QtGui.QLabel (self.label)» ошибается. – whuiscool

4

по умолчанию QLabel :: setScaledContents не работал для меня, так как он не сделал позвольте мне сохранить соотношение сторон, когда изображения, где больше, чем максимальные размеры метки .

Этого маленький помощник будет масштабировать изображение вниз, чтобы вписаться в максимальный размер этикетки, если это необходимо (но не вверх), всегда сохраняя пропорцию:

/** 
* Fill a QLabel widget with an image file, respecting the widget's maximum sizes, 
* while scaling the image down if needed (but not up), and keeping the aspect ratio 
* Returns false if image loading failed 
****************************************************************************/ 
static bool SetLabelImage(QLabel *label, QString imageFileName) 
{ 
    QPixmap pixmap(imageFileName); 
    if (pixmap.isNull()) return false; 

    int w = std::min(pixmap.width(), label->maximumWidth()); 
    int h = std::min(pixmap.height(), label->maximumHeight()); 
    pixmap = pixmap.scaled(QSize(w, h), Qt::KeepAspectRatio, Qt::SmoothTransformation); 
    label->setPixmap(pixmap); 
    return true; 
} 
+0

Вы знаете, как я мог реализовать это в Python? –

+0

@ Vitto Код, предоставленный @Petrucio, можно легко переписать на Python. Вам просто нужно посмотреть документацию PyQt, чтобы вы не пропустили какое-либо имя пакета и т. Д. «Std :: min» и «std :: max» также могут быть заменены встроенными функциями Python, которые делают то же самое. – rbaleksandar