QT--绘图设备

一、 绘图设备:

  1. QPixmap: 针对屏幕进行优化,和平台相关(显卡之类),不能对图片进行修改。

  2. QImage: 和平台无关,可以对图片进行修改,可以在线程中绘图。

  3. QPicture: 保存绘图的状态(二进制文件)

1.1 QPixmap :

    //创建一个绘图设备
    QPixmap pixmap(400,300);  //绘图设备大小为400x300
    //创建画家
    QPainter p(&pixmap);
    //填充背景色
    pixmap.fill(Qt::white);
    p.drawPixmap(0,0,80,80,QPixmap("E:\\C++QT\\test\\Image\\AR.png"));

    //保存图片
    pixmap.save("E:\\C++QT\\test\\Image\\pp.png");

1.2 QImage: 可以对图片进行修改,可以在线程中绘图

    //创建绘图设备, QImage::Format_ARGB32背景透明
    QImage image(400,300,QImage::Format_ARGB32);
    QPainter p;
    p.begin(&image);
    //绘图
    p.drawImage(0,0,QImage("E:\\C++QT\\test\\Image\\AR.png"));
    p.end();
    image.save("E:\\C++QT\\test\\Image\\rr.png");

3. QPicture: 保存绘图的状态(二进制文件)

 QPicture picture;
    QPainter p;
    p.begin(&picture);
    p.drawPixmap(0,0,80,80,QPixmap("E:\\C++QT\\test\\Image\\AR.png"));
    p.drawLine(50,50,150,50);
    p.end();
    //保存二进制文件
    picture.save("E:\\C++QT\\test\\Image\\CC.png");  //二进制文件
void Widget::paintEvent(QPaintEvent *event)
{
    //加载二进制文件
    QPicture pic;
    pic.load("E:\\C++QT\\test\\Image\\CC.png"); //加载文件

    QPainter p(this);
    p.drawPicture(0,0,pic);
}

二、QImage与Mat类型互相转化

//实现将Mat转化为QImage
QImage Widget::MatToQImage(const Mat cvImg)
{
   QImage qImg;
   if(cvImg.channels()==3)
   {
       //opencv彩色图像格式为BGR,要将其转换为RGB
       cvtColor(cvImg,cvImg,CV_BGR2RGB);
       qImg=QImage((const unsigned char*)(cvImg.data),
                   cvImg.cols,
                   cvImg.rows,
                   cvImg.cols*cvImg.channels(),
                   QImage::Format_RGB888);
   }
   else if(cvImg.channels()==1)   //单通道图像
   {
       qImg=QImage((const unsigned char*)(cvImg.data),
                   cvImg.cols,cvImg.rows,
                   cvImg.cols*cvImg.channels(),
                   QImage::Format_Indexed8);
       QVector<QRgb> colorTable;
       for(int k=0;k<256;k++)
       {
           colorTable.push_back(qRgb(k,k,k));
       }
       qImg.setColorTable(colorTable);
   }
   else
   {
       qImg = QImage((const unsigned char*)(cvImg.data),
                     cvImg.cols,
                     cvImg.rows,
                     cvImg.cols*cvImg.channels(),
                     QImage::Format_RGB888);
   }
   return qImg;
}

//实现将QImage转化为MAT
Mat Widget::QImage2cvMat(QImage image)
{
    cv::Mat mat;
        qDebug() << image.format();
        switch(image.format())
        {
        case QImage::Format_ARGB32:
        case QImage::Format_RGB32:
        case QImage::Format_ARGB32_Premultiplied:
            mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
            break;
        case QImage::Format_RGB888:
            mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
            cv::cvtColor(mat, mat, CV_BGR2RGB);
            break;
        case QImage::Format_Indexed8:
            mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
            break;
        }
        return mat;
}

2.1 使用方法示例:

void Widget::on_pushButton_clicked()
{
    QString path=QFileDialog::getOpenFileName(this,tr("打开文件"),"../");
    QImage image;
    if(path.isEmpty()==false)
    {
        //载入图片
        bool isOK=image.load(path);
        if(isOK==false)
        {
            QMessageBox::information(this,
                                     tr("warning"),
                                     tr("打开图像失败!")
                                     );
//           delete image;
            return;
        }
        image=image.convertToFormat(QImage::Format_ARGB32);
        Mat img=QImage2cvMat(image);
//        namedWindow("a");
//        imshow("a",img);
        //将图像灰度化处理;
        Mat img_gray;
        cvtColor(img,img_gray,CV_BGR2GRAY);
        //OTSU二值化处理
        Mat img_BW;
        threshold(img_gray,img_BW,0,255,CV_THRESH_OTSU);

        //将mat类型数据转化为QImage类型      
        QImage image_Q=MatToQImage(img_BW);
        image_Q.scaled(ui->label->size(),Qt::KeepAspectRatio);
        //设置Label的属性ScaledContents,该属性的作用实时允许label缩放他的内容充满整个可用空间。
        ui->label->setScaledContents(true);
        ui->label->setPixmap(QPixmap::fromImage((image_Q)));
        waitKey(0);
    }
}

三、Tcp通信:

通讯结构图:

在这里插入图片描述

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    tcpServer=NULL;
    tcpSocket=NULL;
    
    //为该窗体设置标题
    setWindowTitle("服务器端,port8888");
    //创建监听套接字
    tcpServer=new QTcpServer(this);  //此处指定父对象的作用是自动回收空间,不指定也是可以的。

    //QHostAddress::Any 绑定当前网卡的所有的IP
    tcpServer->listen(QHostAddress::Any,8888);

    //槽函数中取出通信套接字,进行通信。
    connect(tcpServer,&QTcpServer::newConnection,
            [=]()
            {
               //取出建立好连接的通信套接字
               tcpSocket =tcpServer->nextPendingConnection();
               //在对话框中显示当前客户端连接成功
               //1.获取对方的IP和端口
               QString ip=tcpSocket->peerAddress().toString();
               qint16 port=tcpSocket->peerPort();
               //2打包IP和端口
               QString temp=QString("[%1,%2]:成功连接").arg(ip).arg(port);
               //3.显示信息
               ui->read->setText(temp);
               
               //该槽函数的位置应该注意,避免出现野指针的问题。
               //当客户端数据发送成功,服务器端通信套接字会触发readyRead(),需要在对应的槽函数中做处理
               connect(tcpSocket,&QTcpSocket::readyRead,
                       [=]()
                       {
                         //从通信套接字中取出内容
                         QByteArray array= tcpSocket->readAll();
                         //在文本框中追加内容。
                         ui->read->append(array);
                       }
                       );
            }
            );
}

Widget::~Widget()
{
    delete ui;
}

//发送信息
void Widget::on_buttonSend_clicked()
{
    if(NULL==tcpSocket)
    {
        return;
    }
    //获取编辑去的内容
    QString str=ui->write->toPlainText();
    //给对方客户端发送信息,使用tcpSocket套接字
    //
    tcpSocket->write(str.toUtf8().data());
}

//断开连接
void Widget::on_buttonClose_clicked()
{
    if(tcpSocket!=NULL)
    {
        //主动和客户端断开连接
        tcpSocket->disconnectFromHost();
        tcpSocket->close();
    }
    tcpSocket=NULL;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值