QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2943|回复: 5

求助:请教大家一个QT的画图问题(急)

[复制链接]
发表于 2006-6-8 16:29:26 | 显示全部楼层 |阅读模式
下面这个程序能使用鼠标画直线,但是画了新的直线后原来的就消失了,请问如何让已经画好的直线不消失?请高手指点啊!多谢!!!
#include <qwidget.h>
#include <qpainter.h>
#include <qapplication.h>
#include <stdlib.h>

const int MAXPOINTS = 2000;                     // maximum number of points
const int MAXCOLORS = 40;

class ConnectWidget : public QWidget
{
public:
    ConnectWidget( QWidget *parent=0, const char *name=0 );
   ~ConnectWidget();
protected:
    void        paintEvent( QPaintEvent * );
    void        mousePressEvent( QMouseEvent *);
    void        mouseReleaseEvent( QMouseEvent *);
    void        mouseMoveEvent( QMouseEvent *);
private:
    QPoint     *points;                         // point array
    QColor     *colors;                         // color array
    int         count;                          // count = number of points
    bool        down;                           // TRUE if mouse down
};

ConnectWidget::ConnectWidget( QWidget *parent, const char *name )
    : QWidget( parent, name, WStaticContents )
{
    setBackgroundColor( white );                // white background
    count = 0;
    down = FALSE;
    points = new QPoint[MAXPOINTS];
    colors = new QColor[MAXCOLORS];
    for ( int i=0; i<MAXCOLORS; i++ )           // init color array
        colors = QColor( rand()&255, rand()&255, rand()&255 );
}

ConnectWidget::~ConnectWidget()
{
    delete[] points;                            // cleanup
    delete[] colors;
}

void ConnectWidget::paintEvent( QPaintEvent * )
{
    QPainter paint( this );
    paint.setPen( colors[rand()%MAXCOLORS] ); // set random pen color
    paint.drawLine( points[0], points[count-1] ); // draw line

}

void ConnectWidget::mousePressEvent( QMouseEvent * )
{
    down = TRUE;
    count = 0;                                  // start recording points
    erase();                                    // erase widget contents
}

void ConnectWidget::mouseReleaseEvent( QMouseEvent * )
{
    down = FALSE;                               // done recording points
    update();                                   // draw the lines
}

void ConnectWidget::mouseMoveEvent( QMouseEvent *e )
{
    if ( down && count < MAXPOINTS ) {
        QPainter paint( this );
        points[count++] = e->pos();             // add point
        paint.drawPoint( e->pos() );            // plot point
    }
}

int main( int argc, char **argv )
{
    QApplication a( argc, argv );
    ConnectWidget connect;
#ifndef QT_NO_WIDGET_TOPEXTRA   // for Qt/Embedded minimal build
    connect.setCaption( "Qt Example - Draw lines");
#endif
    a.setMainWidget( &connect );
    connect.show();
    return a.exec();
}
发表于 2006-6-11 05:02:43 | 显示全部楼层

Re: 求助:请教大家一个QT的画图问题(急)

[quote:5fada19c78="realxin"]下面这个程序能使用鼠标画直线,但是画了新的直线后原来的就消失了,请问如何让已经画好的直线不消失?请高手指点啊!多谢!!!
#include <qwidget.h>
#include <qpainter.h>
#include <qapplication.h>
#include <stdlib.h>

const int MAXPOINTS = 2000;                     // maximum number of points
const int MAXCOLORS = 40;

class ConnectWidget : public QWidget
{
public:
    ConnectWidget( QWidget *parent=0, const char *name=0 );
   ~ConnectWidget();
protected:
    void        paintEvent( QPaintEvent * );
    void        mousePressEvent( QMouseEvent *);
    void        mouseReleaseEvent( QMouseEvent *);
    void        mouseMoveEvent( QMouseEvent *);
private:
    QPoint     *points;                         // point array
    QColor     *colors;                         // color array
    int         count;                          // count = number of points
    bool        down;                           // TRUE if mouse down
};

ConnectWidget::ConnectWidget( QWidget *parent, const char *name )
    : QWidget( parent, name, WStaticContents )
{
    setBackgroundColor( white );                // white background
    count = 0;
    down = FALSE;
    points = new QPoint[MAXPOINTS];
    colors = new QColor[MAXCOLORS];
    for ( int i=0; i<MAXCOLORS; i++ )           // init color array
        colors = QColor( rand()&255, rand()&255, rand()&255 );
}

ConnectWidget::~ConnectWidget()
{
    delete[] points;                            // cleanup
    delete[] colors;
}

void ConnectWidget::paintEvent( QPaintEvent * )
{
    QPainter paint( this );
    paint.setPen( colors[rand()%MAXCOLORS] ); // set random pen color
    paint.drawLine( points[0], points[count-1] ); // draw line

}

void ConnectWidget::mousePressEvent( QMouseEvent * )
{
    down = TRUE;
    count = 0;                                  // start recording points
    erase();                                    // erase widget contents
}

void ConnectWidget::mouseReleaseEvent( QMouseEvent * )
{
    down = FALSE;                               // done recording points
    update();                                   // draw the lines
}

void ConnectWidget::mouseMoveEvent( QMouseEvent *e )
{
    if ( down && count < MAXPOINTS ) {
        QPainter paint( this );
        points[count++] = e->pos();             // add point
        paint.drawPoint( e->pos() );            // plot point
    }
}

int main( int argc, char **argv )
{
    QApplication a( argc, argv );
    ConnectWidget connect;
#ifndef QT_NO_WIDGET_TOPEXTRA   // for Qt/Embedded minimal build
    connect.setCaption( "Qt Example - Draw lines");
#endif
    a.setMainWidget( &connect );
    connect.show();
    return a.exec();
}[/quote]


我也是刚刚开始学习Linux的编程,不太清楚,但是我想和Windows下面应该差不多,在Windows下面需要将原来的保存(可以保存坐标)。当画下一条线时先画原来的,再画新的。
回复

使用道具 举报

发表于 2006-6-11 10:40:39 | 显示全部楼层
可以用double buffer 的方法, 所有画图操作都先画到一个  QImage 或者 QPixmap 上, 然后用这个图来更新屏幕。

当然, 你保存用户动作, 每次都重复画所有用户进行过的动作, 也可以。
回复

使用道具 举报

 楼主| 发表于 2006-6-18 14:25:50 | 显示全部楼层
感谢两位!现在所有画图操作都画到QPixmap上了,请问如何能够实现用鼠标把画好的图拖动到指定的位置呢?
回复

使用道具 举报

发表于 2006-6-21 08:40:15 | 显示全部楼层
建议去这里看一本书
http://www.qtopia.org.cn/phpBB2/viewtopic.php?t=8
C++ GUI Programming with Qt 3
回复

使用道具 举报

 楼主| 发表于 2006-6-24 12:02:02 | 显示全部楼层
[quote:c3f6c7dbba="cavendish"]建议去这里看一本书
http://www.qtopia.org.cn/phpBB2/viewtopic.php?t=8
C++ GUI Programming with Qt 3[/quote]

多谢!这本书真的不错!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 12:38 , Processed in 0.045176 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表