QT 添加图像控件并打开

  话说这是第一次用QT,各种不适应,距离上一次使用此类工具已经好久了。记得之前是C#,用起来异常方便。首先吐槽下关于QT的编辑器,被VS甩了一大街是肯定的,用得太不习惯了。

  这次是要进行简易的图像处理,老师说什么直接用C和OpenCV,还需要交互,还是饶了我吧,重点是C的交互真不容易,现在实在毫无心情去折腾MFC,被坑过一次,还不如来QT或PyQT之类的。

  需求是这样的,最初的,打开一张图片,仅此而已。对于当时一片空白的人来说,查文档吧,昨天搞定了菜单,实在不容易,只能说实际上和我想的不一样。发现一点,之前在MFC上最坑的信号处理在这里变得容易多了,还有拖控件的玩意似乎没有微软的做得实用,好多容易混淆。

  打开图片的代码相对容易,如下:

QString file = QFileDialog::getOpenFileName(this, tr("Open File"), " ",  tr("Image(*.bmp *.png *.jpg *.jpeg)"));
qDebug() << "String" << file;
if(!file.isEmpty()){
   ui->widget->setImage(QImage(file));
}

  而处理图片就需要一个类了,这里使用QWidget来显示图片,最好的方式还是用QPainter了,当然,网上这么说我也就这么用。而图像的处理就使用QImage,也不错的,可以对像素点进行处理是我所需要的。

#mypainterwidget.h 头文件
#ifndef MYPAINTERWIDGET_H
#define MYPAINTERWIDGET_H

#include <QWidget>
#include <QPaintEvent>
#include <QImage>

class MyPainterWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyPainterWidget(QWidget *parent = 0);
    const QImage *image() const;

protected:
    void paintEvent(QPaintEvent *);

public slots:
    void setImage(const QImage &img);

private:
    QImage m_image;
};

#endif // MYPAINTERWIDGET_H

  这里使用的其实是一个更新机制,实现起来挺简单的,查了好多地方最后终于找到,当然如果自己让我找估计也问题不大,就是QT的文档真不习惯,难道是字体的原因么。

#mypainterwidget.cpp 程序文件
#include "mypainterwidget.h"
#include <QPainter>
#include <QImage>

MyPainterWidget::MyPainterWidget(QWidget *parent) :
    QWidget(parent)
{
}

void MyPainterWidget::paintEvent(QPaintEvent *event)
{
    QWidget::paintEvent(event);

    if (m_image.isNull())
        return;

    QPainter painter(this);
    painter.drawImage(rect(),m_image);
}

const QImage* MyPainterWidget::image() const
{
    return &m_image;
}

void MyPainterWidget::setImage(const QImage &img)
{
    m_image = img;
    this->update();
}

初步的效果图:
QT打开图片

参考:https://www.librehat.com/qt-image-display-widget-autosize-by-subclass-qwidget/

14条评论在“QT 添加图像控件并打开”

写下你最简单的想法