私はQtが初めてで、見つけたほとんどすべてのチュートリアルで、setPixmap()を使用して画像をQLabelに追加するように言われています。これは正しい方法かもしれませんが、画像にラベルを使用することはラベルの目的を超えているように見えるため、そうではないと感じています。
これに「正しい方法」または特別なクラスがあるかどうか、または「ラベルの方法」が単純なものだけでなく正しいものであるかどうか、誰か教えてください。
QLabel の使用は、QtWidgets ベースの UI で画像を表示する通常の方法です。QLabel の API は主にテキストのレンダリングに関係しているため、これは確かに少しぎこちなく感じるかもしれません。しかし、それは仕事をし、画像の描画だけに特化したクラスは他にありません. 独自のクラス (QPixmap を取得し、paintEvent()、sizeHint() を再実装する) を作成することを考えることができますが、それは、QLabel にない機能が必要な場合にのみ意味があります。
ボタンの画像 (QToolButton、QPushButton、...)、グラフィック シーンの画像 (QGraphicsScene/View) など、コンテキストに応じて、画像をペイントする方法は他にもたくさんありますが、それらはすべて、より専門的なまたはより複雑なユースケース。
最も簡単な方法は、QLabel.in ImageViewer の例 を使用することですhttp://qt-project.org/doc/qt-4.8/widgets-imageviewer.html彼らは QLabel を使用しています ..
別の方法
QGraphicsView view(&scene);
QGraphicsPixmapItem item(QPixmap("c:\\test.png"));
scene.addItem(&item);
これは、Label ベースではない単純なクラスです。それは、あなたが個人的にそれを行うための適切な方法であると感じていることと、それをどうする必要があるかによると思います. 後で追加できるように、独自のクラスを実装することを好みます(画像を操作したい場合があります)。
imagewidget.h
#ifndef IMAGEWIDGET_H
#define IMAGEWIDGET_H
#include <QPainter>
#include <QImage>
#include <QWidget>
QT_BEGIN_NAMESPACE
class QPainter;
class QImage;
QT_END_NAMESPACE
class ImageWidget : public QWidget
{
Q_OBJECT
public:
ImageWidget(const QString &filename, QWidget* parent = 0);
~ImageWidget();
bool load(const QString &fileName);
bool save(const QString &fileName);
protected:
void paintEvent(QPaintEvent* event);
private:
QImage img;
};
#endif
imagewidget.cpp
#include <QDebug>
#include "imagewidget.h"
ImageWidget::ImageWidget(const QString &filename, QWidget* parent) : QWidget(parent)
{
img.load(filename);
setMinimumWidth(img.width());
setMinimumHeight(img.height());
setMaximumWidth(img.width());
setMaximumHeight(img.height());
this->show();
}
bool ImageWidget::load(const QString &fileName)
{
img.load(fileName);
return true;
}
bool ImageWidget::save(const QString &fileName)
{
img.save(fileName, "PNG");
return true;
}
ImageWidget::~ImageWidget()
{
}
void ImageWidget::paintEvent(QPaintEvent*)
{
QPainter painter(this);
painter.setViewport(0, 0, width(), height());
painter.setWindow(0, 0, width(), height());
painter.drawImage(0, 0, img);
}