Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在QtWidget上动态绘制线_C++_Qt_Qtgui - Fatal编程技术网

C++ 在QtWidget上动态绘制线

C++ 在QtWidget上动态绘制线,c++,qt,qtgui,C++,Qt,Qtgui,下面是一个在小部件上画线的代码。问题是它保持了以前画的线,并且在每次鼠标移动时,它会一次又一次地画。我想像mspaint一样画画,也就是说,只有在鼠标释放事件时,它才会完成线条绘制(否则只需预览线条)。我考虑的一个想法是在每次鼠标移动时删除预览线,另一个想法是绘制一些临时视图并在鼠标释放时完成它。但是很难找到一个合适的方法去做。 谢谢你的帮助 #include "paintwidget.h" #include "ui_paintwidget.h" #include <QtGui>

下面是一个在小部件上画线的代码。问题是它保持了以前画的线,并且在每次鼠标移动时,它会一次又一次地画。我想像mspaint一样画画,也就是说,只有在鼠标释放事件时,它才会完成线条绘制(否则只需预览线条)。我考虑的一个想法是在每次鼠标移动时删除预览线,另一个想法是绘制一些临时视图并在鼠标释放时完成它。但是很难找到一个合适的方法去做。 谢谢你的帮助

#include "paintwidget.h"
#include "ui_paintwidget.h"

#include <QtGui>

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

    m_nInitialX = 0;
    m_nInitialY = 0;
    m_nFinalX = 0;
    m_nFinalY = 0;
    m_nPTargetPixmap = 0;
    m_nPTargetPixmap = new QPixmap(400, 400);
    m_nbMousePressed = false;
}

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

void paintWidget::mousePressEvent(QMouseEvent* event)
{
    m_nbMousePressed = true;
    m_nInitialX = event->pos().x();
    m_nInitialY = event->pos().y();
}

void paintWidget::mouseReleaseEvent(QMouseEvent* event)
{
    m_nbMousePressed = false;
    //update();
}

void paintWidget::paintEvent(QPaintEvent* e)
{
    if (m_nbMousePressed) {
        QPainter PixmapPainter(m_nPTargetPixmap);
        QPen pen(Qt::green);
        PixmapPainter.setPen(pen);
        //PixmapPainter.drawLine(m_nInitialX, m_nInitialY, m_nFinalX, m_nFinalY);
    }
    QPainter painter(this);
    painter.drawPixmap(0, 0, *m_nPTargetPixmap);
}

void paintWidget::mouseMoveEvent(QMouseEvent* event)
{
    if (event->type() == QEvent::MouseMove) {
        QPainter PixmapPainter(m_nPTargetPixmap);
        QPen pen(Qt::black);
        PixmapPainter.setPen(pen);
        PixmapPainter.drawLine(m_nInitialX, m_nInitialY, m_nFinalX, m_nFinalY);
        update(); // update your view
        m_nFinalX = event->pos().x();
        m_nFinalY = event->pos().y();
    }
    update(); // update your view
}
#包括“paintwidget.h”
#包括“ui_paintwidget.h”
#包括
paintWidget::paintWidget(QWidget*父项)
:QWidget(父项)
,ui(新ui::paintWidget)
{
用户界面->设置用户界面(此);
m_ninitalx=0;
m_nInitialY=0;
m_nFinalX=0;
m_nFinalY=0;
m_nPTargetPixmap=0;
m_nPTargetPixmap=新的QPixmap(400400);
m_nbMousePressed=假;
}
paintWidget::~paintWidget()
{
删除用户界面;
}
void paintWidget::mousePressEvent(QMouseEvent*event)
{
m_nbMousePressed=真;
m_ninitalx=事件->位置();
m_nInitialY=事件->位置();
}
void paintWidget::mouseReleaseEvent(QMouseEvent*事件)
{
m_nbMousePressed=假;
//更新();
}
void paintWidget::paintEvent(QPaintEvent*e)
{
如果(鼠标按下){
QPainter Pixmappainer(m_nPTargetPixmap);
QPen笔(Qt::绿色);
pixmappainer.setPen(笔);
//Pixmappainer.拉丝(m_Ninitalx,m_Ninitaly,m_nFinalX,m_nFinalY);
}
油漆工(本);
painter.drawPixmap(0,0,*m_nPTargetPixmap);
}
void paintWidget::mouseMoveEvent(QMouseEvent*event)
{
如果(事件->类型()==QEvent::MouseMove){
QPainter Pixmappainer(m_nPTargetPixmap);
QPen笔(Qt::黑色);
pixmappainer.setPen(笔);
Pixmappainer.拉丝(m_Ninitalx,m_Ninitaly,m_nFinalX,m_nFinalY);
update();//更新您的视图
m_nFinalX=事件->位置();
m_nfinity=事件->位置();
}
update();//更新您的视图
}
我把我的源代码放在这里:

请注意添加的注释

以下是相关文件:

#include "paintwidget.h"
#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QDebug>

PaintWidget::PaintWidget(QWidget *parent) : QWidget(parent)
{
// the ui form wasn't needed here, so I added it without it.

// QLine neatly keeps track of both the two points, m_line in this case
//    m_nInitialX = 0;
//    m_nInitialY = 0;
//    m_nFinalX = 0;
//    m_nFinalY = 0;
//    m_nPTargetPixmap = 0;
//    m_nPTargetPixmap = new QPixmap(400,400);
    m_nPTargetPixmap = QPixmap(400,400);// put the pixmap on the stack instead of the heap
    m_nPTargetPixmap.fill();
    m_nbMousePressed = false;
}

PaintWidget::~PaintWidget()
{
//    delete ui;
}

void PaintWidget::mousePressEvent(QMouseEvent* event)
{
    m_nbMousePressed = true;
//    m_nInitialX = event->pos().x();
//    m_nInitialY = event->pos().y();
    m_line.setP1(event->pos());
    m_line.setP2(event->pos());
}

void PaintWidget::mouseReleaseEvent(QMouseEvent *event)
{
    m_nbMousePressed = false;
    update();
}

void PaintWidget::paintEvent(QPaintEvent *e)
{
    static bool wasPressed = false;
    QPainter painter(this);

    if(m_nbMousePressed)
    {
        painter.drawPixmap(0, 0, m_nPTargetPixmap);
        painter.drawLine(m_line);
        wasPressed = true;
    }
    else if(wasPressed)
    {
        // Note that this painting only needs to happen once,
        // right when the mouse is released.
        QPainter PixmapPainter(&m_nPTargetPixmap);
        QPen pen(Qt::green);
        PixmapPainter.setPen(pen);
        PixmapPainter.drawLine(m_line);

        painter.drawPixmap(0, 0, m_nPTargetPixmap);
        wasPressed = false;
    }
}

void PaintWidget::mouseMoveEvent(QMouseEvent *event)
{
    if (event->type() == QEvent::MouseMove)
    {
//        QPainter PixmapPainter(m_nPTargetPixmap);
//        QPen pen(Qt::black);
//        PixmapPainter.setPen(pen);
//        PixmapPainter.drawLine(m_nInitialX, m_nInitialY, m_nFinalX, m_nFinalY);
//        m_nFinalX = event->pos().x();
//        m_nFinalY = event->pos().y();
        m_line.setP2(event->pos());
//        update(); // update your view
    }
    update(); // update your view
}
#包括“paintwidget.h”
#包括
#包括
#包括
#包括
PaintWidget::PaintWidget(QWidget*parent):QWidget(parent)
{
//这里不需要ui表单,所以我添加了它而没有它。
//QLine整齐地跟踪这两个点,在本例中为m_线
//m_ninitalx=0;
//m_nInitialY=0;
//m_nFinalX=0;
//m_nFinalY=0;
//m_nPTargetPixmap=0;
//m_nPTargetPixmap=新的QPixmap(400400);
m_nPTargetPixmap=QPixmap(400400);//将pixmap放在堆栈而不是堆上
m_nPTargetPixmap.fill();
m_nbMousePressed=假;
}
PaintWidget::~PaintWidget()
{
//删除用户界面;
}
void PaintWidget::mousePressEvent(QMouseEvent*event)
{
m_nbMousePressed=真;
//m_ninitalx=事件->位置();
//m_nInitialY=事件->位置();
m_line.setP1(事件->位置());
m_line.setP2(事件->位置());
}
void PaintWidget::mouseReleaseEvent(QMouseEvent*事件)
{
m_nbMousePressed=假;
更新();
}
void PaintWidget::paintEvent(QPaintEvent*e)
{
静态布尔值被按下=假;
油漆工(本);
如果(鼠标按下)
{
painter.drawPixmap(0,0,m_nPTargetPixmap);
油漆工。拉丝(m_线);
wasPressed=true;
}
否则,如果(已按下)
{
//注意这幅画只需要画一次,
//鼠标松开的时候。
QPainter Pixmappainer(&m_nPTargetPixmap);
QPen笔(Qt::绿色);
pixmappainer.setPen(笔);
Pixmappainer.拉线(m_线);
painter.drawPixmap(0,0,m_nPTargetPixmap);
wasPressed=false;
}
}
void PaintWidget::mouseMoveEvent(QMouseEvent*event)
{
如果(事件->类型()==QEvent::MouseMove)
{
//QPainter Pixmappainer(m_nPTargetPixmap);
//QPen笔(Qt::黑色);
//pixmappainer.setPen(笔);
//Pixmappainer.拉丝(m_Ninitalx,m_Ninitaly,m_nFinalX,m_nFinalY);
//m_nFinalX=事件->位置();
//m_nfinity=事件->位置();
m_line.setP2(事件->位置());
//update();//更新您的视图
}
update();//更新您的视图
}

更新:使用QGraphicscene和绘制线和椭圆的其他信息:

QGraphicscene具有可以在单击场景时添加的线条和椭圆

这个例子似乎特别相似:


希望能有所帮助。

据我所知,m_nPTargetPixmap是一个额外的绘图层,当鼠标被释放时,它正在画家身上绘制。是吗?是的。先画的在底部,最后画的在顶部。