天天看點

基于QT的手寫塗鴉程式設計

應用QT在winodws下實作應用滑鼠手寫,在界面上顯示字迹的程式。項目示範視訊下載下傳 連結:https://pan.baidu.com/s/1D6-U82s7kT7HF0Evae5JAA

提取碼:u0xd

程式實作的思路為,在工程裡用QPixmap 申請一個像素區域空間,然後擷取滑鼠坐标,應用QPainter改變擷取到的滑鼠坐标位置的像素顔色。涉及到QPainter如何與QPixmap關聯,應用mouseEvent獲位置,以及應用布局管理器實作界面。

頭檔案widget.h内容

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QHBoxLayout>
#include <QLabel>
#include <QPixmap>
#include <QPushButton>
#include <QMouseEvent>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
protected:
    void mouseMoveEvent(QMouseEvent *e);
private:
    Ui::Widget *ui;
    QPixmap impixmap;
    QLabel *imagelabel;
    QHBoxLayout *hlayout1,*hlayout2;
    QVBoxLayout *vlayout;
    QPushButton *red,*green,*blue,*clear;
    unsigned char colorflag;
private slots:
    void on_redbutton_clicked();
    void on_greenbutton_clicked();
    void on_bluebutton_clicked();
    void on_clearbutton_clicked();
};

#endif // WIDGET_H

           

源碼檔案widget.cpp内容

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QPainter>
#include <QPen>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    imagelabel=new QLabel();
    hlayout1=new QHBoxLayout();
    hlayout2=new QHBoxLayout();
    vlayout=new QVBoxLayout();
    red=new QPushButton("Red");
    green=new QPushButton("Green");
    blue=new QPushButton("Blue");
    clear=new QPushButton("clear");
    impixmap=QPixmap(640,480);

    hlayout1->addWidget(imagelabel);
    vlayout->addWidget(red);
    vlayout->addWidget(green);
    vlayout->addWidget(blue);
    vlayout->addWidget(clear);

    hlayout2->addLayout(hlayout1);
    hlayout2->addLayout(vlayout);

    setLayout(hlayout2);
    setWindowTitle("HandWrite");



    imagelabel->setPixmap(impixmap);

    colorflag=0;

    connect(red,SIGNAL(clicked()),this,SLOT(on_redbutton_clicked()));
    connect(green,SIGNAL(clicked()),this,SLOT(on_greenbutton_clicked()));
    connect(blue,SIGNAL(clicked()),this,SLOT(on_bluebutton_clicked()));
    connect(clear,SIGNAL(clicked()),this,SLOT(on_clearbutton_clicked()));
}

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

void Widget::mouseMoveEvent(QMouseEvent *e)
{

    qDebug("xres=%d,yres=%d",e->pos().x(),e->pos().y());
    //change pixmap color by x y

    QPainter painter(&impixmap);
    QPen pen;
    pen.setWidth(4);
    if(colorflag==0) pen.setColor(Qt::red);
    if(colorflag==1) pen.setColor(Qt::green);
    if(colorflag==2) pen.setColor(Qt::blue);
    painter.setPen(pen);

    painter.drawPoint(e->pos().x(),e->pos().y());

    imagelabel->setPixmap(impixmap);


}

void Widget::on_redbutton_clicked()
{
    qDebug()<<"Red Clicked1";
   colorflag=0;

}


void Widget::on_greenbutton_clicked()
{
   qDebug()<<"Green Clicked1";
   colorflag=1;
}

void Widget::on_bluebutton_clicked()
{
   qDebug()<<"Blue Clicked1";
   colorflag=2;

}

void Widget::on_clearbutton_clicked()
{
    qDebug()<<"Clear Clicked1";
    impixmap.fill(Qt::black);
    imagelabel->setPixmap(impixmap);

}