呜啊呜wuawu 2021-05-11 11:57 采纳率: 66.7%
浏览 145
已采纳

QT在Widget上绘制图片

刚学QT,就是重写一个widget类,在这个里面操作,但这个显示图片不知道哪里不对,望指点

MainWindow.h

#pragma once

#include <QtWidgets/QWidget>
#include "ui_MainWindow.h"
#include "MyWidget.h"

class MainWindow : public QWidget
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = Q_NULLPTR);
protected slots:
    void openFile();
private:
    Ui::MainWindowClass ui;
    MyWidget* mywidget;
};

MainWindow.cpp

#include "MainWindow.h"
#include <qpainter.h>
#include <qfiledialog.h>

MainWindow::MainWindow(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    mywidget = new MyWidget();
    connect(ui.openFile, SIGNAL(clicked()), this, SLOT(openFile()));
}
void MainWindow::openFile()
{
    QString curPath = QDir::currentPath();//获取系统当前目录
    QString dlgTitle = "选择一张图片"; //对话框标题
    QString filter = "图片文件(*.jpg *.png)"; //文件过滤器
    QString aFileName = QFileDialog::getOpenFileName(this, dlgTitle, curPath, filter);
    if (!aFileName.isEmpty())
        mywidget->setImage(aFileName);
}

MyWidget.h

#pragma once
#include <qwidget.h>
#include <qpainter.h>
#include <qimage.h>
#include <qtimer.h>
class MyWidget :
    public QWidget
{
public:
    MyWidget(QWidget* parent = 0);
    void setImage(QString name);
protected:
    void paintEvent(QPaintEvent*);
    
private:
    QPainter* painter;
    QImage image;
};

MyWidget.cpp

#include "MyWidget.h"

MyWidget::MyWidget(QWidget* parent):QWidget(parent)
{
	painter = new QPainter;
}

void MyWidget::paintEvent(QPaintEvent*)
{
	painter->begin(this);
	painter->drawImage(QRectF(0, 0, width(), height()),image);
	painter->end();
}

void MyWidget::setImage(QString name)
{
	QImage img;
	img.load(name);
	if(!img.isNull())
        image = img;
}
  • 写回答

4条回答 默认 最新

  • qfl_sdu 2021-05-11 13:54
    关注

    MyWidget类修改如下,如有帮助,忘采纳,谢谢。

    Mywidget.h如下:

    class MyWidget : public QWidget
    {
    public:
        MyWidget(QWidget* parent = 0);
        void setImage(QString name);
    protected:
        void paintEvent(QPaintEvent*);
        
    private:
        QImage image;
    };

    Mywidget.cpp如下

    #include "MyWidget.h"
    #include <QPainter>
    MyWidget::MyWidget(QWidget* parent):QWidget(parent)
    {
    }
     
    void MyWidget::paintEvent(QPaintEvent*)
    {
        QPainter painter(this);
        painter.drawImage(QRectF(0, 0, width(), height()),image);
    }
     
    void MyWidget::setImage(QString name)
    {
        if(!name.isEmpty())
        {
            image.load(name);
            update(); //调用paintEvent重绘,缺了这句话不会重绘的
        } 
    }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀