我是 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);
这是一个不基于标签的简单类。我想这取决于您个人认为正确的方法以及您需要做什么。我更喜欢实现我自己的类,这样你以后可以添加它(也许你想操纵图像)。
图像小部件.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
图像小部件.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);
}