qt编程例子
Qt中的多线程编程
在同一个窗口上每隔半秒交替显示动态正 弦波和动态三角波。
QThread 类是最重要的Qt 线程类,提供了 与系统无关的线程。用户可以通过它创建 新线程。QThread 代表在程序中一个单独 的线程控制,在多任务操作系统中,它和 同一进程中的其它线程共享数据,但运行 起来就像一个单独的程序一样。
drawdemo.cpp:
#define PI 3.1415926 #include <stdio.h> #include "drawdemo.h" DrawDemo::DrawDemo( QWidget *parent, const char *name ) :QWidget( parent, name ) { setCaption( "OURS_qt_Example" ); frame = new QFrame( this, "frame" ); frame->setBackgroundColor( black ); frame->setGeometry( QRect( 40, 40, 402, 252 ) ); for( int i=0; i<200; i++ ) { buffer[i] = ( int )( sin( (i*PI) /100 ) * 100 ); }
for( int i=0; i<199; i++ ) { beginPoint.setX( 2*i ); beginPoint.setY( buffer[i] +125 ); endPoint.setX( 2*i+1 ); endPoint.setY( buffer[i+1] +125 ); painter.drawLine( beginPoint, endPoint ); } }
int main() { MyThread a; MyThread b; a.start(); b.start(); a.wait(); b.wait(); }
这将会开始两个线程,每个线程在屏幕上 写20 次“Ping!”并且退出。
本实验以TriThread 类来实现三角波,以 SinThread来实现正弦波。 在两个类的实现过程中,基本类似,这里 以TriThread 来进行阐述。 在TriThread 类的声明中,除了继承了 QWidget 类之外,也继承了QThread 类。 使得画图的同时本身也是一个线程。
本例中的绘制代码
QPoint beginPoint; QPoint endPoint; //定义了两个点,分别代表着画图的起始点和结束点。 painter.setPen( blue ); //设置画笔的颜色为blue。 for( int i=0; i<199; i++ ) { beginPoint.setX( 2*i ); //乘2是为了”拉长”曲线. beginPoint.setY( buffer[i] +125 ); endPoint.setX( 2*i+1 ); endPoint.setY( buffer[i+1] +125 ); painter.drawLine( beginPoint, endPoint ); }
class TriThread: public QWidget, public QThread { Q_OBJECT public: TriThread( QWidget *parent=0, const char *name=0, QFrame *f=NULL ); ……
Qt编程例子
----绘图、多线程、网络编程
实验八 Qt 中的绘图
实现正弦曲线移动的效果
QFrame 类是有框架的窗口部件的基类。 它绘制框架并且调用一个虚函数 drawContents()来填充这个框架。 QFrame 类也能够直接被用来创建没有任 何内容的简单框架,
frame = new QFrame( this, "frame" ); frame->setBackgroundColor( black ); frame->setGeometry( QRect( 40, 40, 402, 252 ) );
它不是在main()中开始,QThread是在run()中开始运行的。 你继承run()并且在其中包含你的代码。例如:
class MyThread : public QThread { public: virtual void run(); }; void MyThread::run() { for( int count = 0; count < 20; count++ ) { sleep( 1 ); qDebug( "Ping!" ); } }
repaint 函数
void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽] 通过立即调用paintEvent()来直接重新绘制窗口部件,除 非更新是失效的或者窗口部件被隐藏。如果erase为真, Qt在paintEvent()调用之前擦除区域(x,y,w,h)。 当某个窗口或者部件接收到了“重画”的消息时,它便使 用paintEvent()函数画图,而 我们画图的基本方法就是重载QWidget 的虚方法 paintEvent()。当然,这个只能针对QWidget 的派生类。
void SimpleExampleWidget::paintEvent() { QPainter paint( this ); paint.setPen( Qt::blue ); paint.drawText( rect(), AlignCenter, “The Text” );//在矩形中绘制文本 }
使用方法很简单并且这里有你可以使用的许多 设置: font()是当前设置的字体 brush()是当前设置的画刷,用来填充例如圆 的颜色或者调色板。 pen()是当前设置的画笔,用来画线或者边缘 的颜色或者点画。 pos()是当前位置,通过moveTo()设置并且 通过lineTo()使用。
QTimer类
QTimer 类是Qt 中关于定时器的一个类, 它提供了定时器信号和单触发定时器。 它在内部使用定时器事件来提供更通用 的定时器(关于定时器事件,请参照: QTimerEvent)。QTimer很容易使用:创 建一个QTimer,使用start()来开始并且把 它的timeout()连接到适当的槽。当这段时 间过去了,它将会发射timeoutclude <qapplication.h> #include "drawdemo.h" int main( int argc, char **argv ) { QApplication app( argc, argv ); DrawDemo *drawdemo = new DrawDemo( 0 ); drawdemo->setGeometry(10, 20, 480, 320 ); app.setMainWidget( drawdemo ); drawdemo->show(); int result = app.exec(); return result; }
QTimer *timer = new QTimer( this, "timer" ); connect( timer, SIGNAL( timeout() ), this, SLOT( flushBuff() ) ); timer->start( 30 ); }
void DrawDemo::flushBuff() { int tmp = buffer[0]; int i; for( i=0; i<200; i++ ) { buffer[i] = buffer[i+1]; } buffer[199] = tmp; repaint( 0, 0, 480, 320, TRUE ); } void DrawDemo::paintEvent( QPaintEvent * ) { frame->erase( 0, 0, 400, 320 ); QPainter painter( frame ); QPoint beginPoint; QPoint endPoint; painter.setPen( blue );
注意当QTimer 的父对象被销毁时,它也会被 自动销毁。实例:
QTimer *timer = new QTimer( myObject ); connect( timer, SIGNAL(timeout()), myObject, SLOT(timerDone()) ); timer->start( 2000, TRUE ); // 2 秒单触发定时器
QPainter 的核心功能是绘制,并且这 里有最简单的绘制函数:
������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ drawPoint():绘制单一的一个点 drawPoints():绘制一组点 drawLine():绘制一条直线 drawRect():绘制一个矩形 drawWinFocusRect():绘制一个窗口焦点矩形 drawRoundRect():绘制一个原形矩形 drawEllipse():绘制一个椭圆 drawArc():绘制一个弧 drawPie():绘制一个饼图 drawChord():绘制一条弦 drawLineSegments():绘制n 条分隔线 drawPolyline():绘制由n 个点组成的多边形 drawPolygon():绘制由n 个点组成的多边形 drawConvexPolygon():绘制由n 个点组成的凸多边形 drawCubicBezier():绘制三次贝塞尔曲线