3

我是 Qt 的新手,几乎我发现的每个教程都说使用 setPixmap() 将图像添加到 QLabel。也许这是正确的方法,但感觉不对,因为为图像使用标签似乎超出了标签的目的。

谁能告诉我是否有“正确的方式”或特殊的类,或者“标签方式”是否正确,而不仅仅是简单的方式。

4

3 回答 3

4

使用 QLabel 是在基于 QtWidgets 的 UI 中显示图像的常用方法。这可能确实有点尴尬,因为 QLabel 的 API 主要关注文本渲染。但是,它可以完成这项工作,并且没有其他类专门用于仅绘制图像。可以考虑编写自己的类(采用 QPixmap,重新实现 paintEvent(),sizeHint()),但这仅在需要 QLabel 缺乏的功能时才对我有意义。

当然,根据上下文,还有许多其他方式来绘制图像,例如按钮上的图像(QToolButton、QPushButton、...)、图形场景中的图像(QGraphicsScene/View)等,但它们都提供更专业的服务或更复杂的用例。

于 2013-10-29T06:36:23.183 回答
3

最简单的方法是使用 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);
于 2013-10-29T06:17:50.653 回答
2

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

图像小部件.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);
}
于 2013-10-29T07:52:47.493 回答