📄 canvas-example.html
字号:
<a href="qcanvasitemlist.html">QCanvasItemList</a> list = <a href="qcanvasitem.html#canvas">canvas</a>()->allItems(); QCanvasItemList::Iterator it = list.<a href="qvaluelist.html#begin">begin</a>(); for (; it != list.<a href="qvaluelist.html#end">end</a>(); ++it) { if ( *it ) delete *it; }}<a name="x2726"></a>void FigureEditor::<a href="qscrollview.html#contentsMouseMoveEvent">contentsMouseMoveEvent</a>(QMouseEvent* e){ if ( moving ) { <a href="qpoint.html">QPoint</a> p = inverseWorldMatrix().map(e->pos()); moving->moveBy(p.<a href="qpoint.html#x">x</a>() - moving_start.x(), p.<a href="qpoint.html#y">y</a>() - moving_start.y()); moving_start = p; <a href="qcanvasitem.html#canvas">canvas</a>()->update(); }}<a name="f587"></a>BouncyLogo::BouncyLogo(QCanvas* canvas) : <a href="qcanvassprite.html">QCanvasSprite</a>(0,canvas){ static QCanvasPixmapArray logo("qt-trans.xpm"); <a href="qcanvassprite.html#setSequence">setSequence</a>(&logo); <a href="qcanvasitem.html#setAnimated">setAnimated</a>(TRUE); initPos();}const int logo_rtti = 1234;<a name="x2704"></a>int BouncyLogo::<a href="qcanvassprite.html#rtti">rtti</a>() const{ return logo_rtti;}void <a name="f588"></a>BouncyLogo::initPos(){ initSpeed(); int trial=1000; do { <a href="qcanvassprite.html#move">move</a>(rand()%canvas()->width(),rand()%canvas()->height()); advance(0); } while (trial-- && xVelocity()==0.0 && yVelocity()==0.0);}void <a name="f589"></a>BouncyLogo::initSpeed(){ const double speed = 4.0; double d = (double)(rand()%1024) / 1024.0; setVelocity( d*speed*2-speed, (1-d)*speed*2-speed );}<a name="x2703"></a>void BouncyLogo::<a href="qcanvassprite.html#advance">advance</a>(int stage){ switch ( stage ) { case 0: { double vx = xVelocity(); double vy = yVelocity(); if ( vx == 0.0 && vy == 0.0 ) { // stopped last turn initSpeed(); vx = xVelocity(); vy = yVelocity(); } double nx = <a href="qwidget.html#x">x</a>() + vx; double ny = <a href="qwidget.html#y">y</a>() + vy; if ( nx < 0 || nx >= canvas()->width() ) vx = -vx; if ( ny < 0 || ny >= canvas()->height() ) vy = -vy; for (int bounce=0; bounce<4; bounce++) { <a href="qcanvasitemlist.html">QCanvasItemList</a> l=collisions(FALSE); for (QCanvasItemList::Iterator it=l.<a href="qvaluelist.html#begin">begin</a>(); it!=l.<a href="qvaluelist.html#end">end</a>(); ++it) { <a href="qcanvasitem.html">QCanvasItem</a> *hit = *it;<a name="x2693"></a><a name="x2690"></a> if ( hit-><a href="qcanvasitem.html#rtti">rtti</a>()==logo_rtti && hit-><a href="qcanvasitem.html#collidesWith">collidesWith</a>(this) ) { switch ( bounce ) { case 0: vx = -vx; break; case 1: vy = -vy; vx = -vx; break; case 2: vx = -vx; break; case 3: // Stop for this turn vx = 0; vy = 0; break; } setVelocity(vx,vy); break; } } } if ( <a href="qwidget.html#x">x</a>()+vx < 0 || x()+vx >= canvas()->width() ) vx = 0; if ( <a href="qwidget.html#y">y</a>()+vy < 0 || y()+vy >= canvas()->height() ) vy = 0; setVelocity(vx,vy); } break; case 1:<a name="x2689"></a> <a href="qcanvasitem.html">QCanvasItem</a>::<a href="qcanvasitem.html#advance">advance</a>(stage); break; }}static uint mainCount = 0;static QImage *butterflyimg;static QImage *logoimg;<a name="f597"></a>Main::Main(QCanvas& c, QWidget* parent, const char* name, WFlags f) : <a href="qmainwindow.html">QMainWindow</a>(parent,name,f), canvas(c){ editor = new FigureEditor(canvas,this); <a href="qmenubar.html">QMenuBar</a>* menu = <a href="qmainwindow.html#menuBar">menuBar</a>(); <a href="qpopupmenu.html">QPopupMenu</a>* file = new <a href="qpopupmenu.html">QPopupMenu</a>( menu );<a name="x2712"></a> file-><a href="qmenudata.html#insertItem">insertItem</a>("&Fill canvas", this, SLOT(init()), CTRL+Key_F); file-><a href="qmenudata.html#insertItem">insertItem</a>("&Erase canvas", this, SLOT(clear()), CTRL+Key_E); file-><a href="qmenudata.html#insertItem">insertItem</a>("&New view", this, SLOT(newView()), CTRL+Key_N); file-><a href="qmenudata.html#insertSeparator">insertSeparator</a>(); file-><a href="qmenudata.html#insertItem">insertItem</a>("&Print", this, SLOT(print()), CTRL+Key_P); file-><a href="qmenudata.html#insertSeparator">insertSeparator</a>(); file-><a href="qmenudata.html#insertItem">insertItem</a>("E&xit", qApp, SLOT(<a href="qapplication.html#quit">quit</a>()), CTRL+Key_Q); menu-><a href="qmenudata.html#insertItem">insertItem</a>("&File", file); <a href="qpopupmenu.html">QPopupMenu</a>* edit = new <a href="qpopupmenu.html">QPopupMenu</a>( menu ); edit-><a href="qmenudata.html#insertItem">insertItem</a>("Add &Circle", this, SLOT(addCircle()), ALT+Key_C); edit-><a href="qmenudata.html#insertItem">insertItem</a>("Add &Hexagon", this, SLOT(addHexagon()), ALT+Key_H); edit-><a href="qmenudata.html#insertItem">insertItem</a>("Add &Polygon", this, SLOT(addPolygon()), ALT+Key_P); edit-><a href="qmenudata.html#insertItem">insertItem</a>("Add Spl&ine", this, SLOT(addSpline()), ALT+Key_I); edit-><a href="qmenudata.html#insertItem">insertItem</a>("Add &Text", this, SLOT(addText()), ALT+Key_T); edit-><a href="qmenudata.html#insertItem">insertItem</a>("Add &Line", this, SLOT(addLine()), ALT+Key_L); edit-><a href="qmenudata.html#insertItem">insertItem</a>("Add &Rectangle", this, SLOT(addRectangle()), ALT+Key_R); edit-><a href="qmenudata.html#insertItem">insertItem</a>("Add &Sprite", this, SLOT(addSprite()), ALT+Key_S); edit-><a href="qmenudata.html#insertItem">insertItem</a>("Create &Mesh", this, SLOT(addMesh()), ALT+Key_M ); edit-><a href="qmenudata.html#insertItem">insertItem</a>("Add &Alpha-blended image", this, SLOT(addButterfly()), ALT+Key_A); menu-><a href="qmenudata.html#insertItem">insertItem</a>("&Edit", edit); <a href="qpopupmenu.html">QPopupMenu</a>* view = new <a href="qpopupmenu.html">QPopupMenu</a>( menu ); view-><a href="qmenudata.html#insertItem">insertItem</a>("&Enlarge", this, SLOT(enlarge()), SHIFT+CTRL+Key_Plus); view-><a href="qmenudata.html#insertItem">insertItem</a>("Shr&ink", this, SLOT(shrink()), SHIFT+CTRL+Key_Minus); view-><a href="qmenudata.html#insertSeparator">insertSeparator</a>(); view-><a href="qmenudata.html#insertItem">insertItem</a>("&Rotate clockwise", this, SLOT(rotateClockwise()), CTRL+Key_PageDown); view-><a href="qmenudata.html#insertItem">insertItem</a>("Rotate &counterclockwise", this, SLOT(rotateCounterClockwise()), CTRL+Key_PageUp); view-><a href="qmenudata.html#insertItem">insertItem</a>("&Zoom in", this, SLOT(zoomIn()), CTRL+Key_Plus); view-><a href="qmenudata.html#insertItem">insertItem</a>("Zoom &out", this, SLOT(zoomOut()), CTRL+Key_Minus); view-><a href="qmenudata.html#insertItem">insertItem</a>("Translate left", this, SLOT(moveL()), CTRL+Key_Left); view-><a href="qmenudata.html#insertItem">insertItem</a>("Translate right", this, SLOT(moveR()), CTRL+Key_Right); view-><a href="qmenudata.html#insertItem">insertItem</a>("Translate up", this, SLOT(moveU()), CTRL+Key_Up); view-><a href="qmenudata.html#insertItem">insertItem</a>("Translate down", this, SLOT(moveD()), CTRL+Key_Down); view-><a href="qmenudata.html#insertItem">insertItem</a>("&Mirror", this, SLOT(mirror()), CTRL+Key_Home); menu-><a href="qmenudata.html#insertItem">insertItem</a>("&View", view); options = new <a href="qpopupmenu.html">QPopupMenu</a>( menu ); dbf_id = options-><a href="qmenudata.html#insertItem">insertItem</a>("Double buffer", this, SLOT(toggleDoubleBuffer()));<a name="x2715"></a> options-><a href="qmenudata.html#setItemChecked">setItemChecked</a>(dbf_id, TRUE); menu-><a href="qmenudata.html#insertItem">insertItem</a>("&Options",options); menu-><a href="qmenudata.html#insertSeparator">insertSeparator</a>(); <a href="qpopupmenu.html">QPopupMenu</a>* help = new <a href="qpopupmenu.html">QPopupMenu</a>( menu ); help-><a href="qmenudata.html#insertItem">insertItem</a>("&About", this, SLOT(help()), Key_F1); help-><a href="qmenudata.html#setItemChecked">setItemChecked</a>(dbf_id, TRUE); menu-><a href="qmenudata.html#insertItem">insertItem</a>("&Help",help); <a href="qmainwindow.html#statusBar">statusBar</a>(); <a href="qmainwindow.html#setCentralWidget">setCentralWidget</a>(editor); printer = 0; init();}void <a name="f598"></a>Main::init(){ clear(); static int r=24; srand(++r); mainCount++; butterflyimg = 0; logoimg = 0; int i;<a name="x2688"></a> for ( i=0; i<canvas.<a href="qcanvas.html#width">width</a>() / 56; i++) { addButterfly(); } for ( i=0; i<canvas.<a href="qcanvas.html#width">width</a>() / 85; i++) { addHexagon(); } for ( i=0; i<canvas.<a href="qcanvas.html#width">width</a>() / 128; i++) { addLogo(); }}Main::~Main(){ delete printer; if ( !--mainCount ) { delete[] butterflyimg; butterflyimg = 0; delete[] logoimg; logoimg = 0; }}void <a name="f599"></a>Main::newView(){ // Open a new view... have it delete when closed. Main *m = new Main(canvas, 0, 0, WDestructiveClose); qApp-><a href="qapplication.html#setMainWidget">setMainWidget</a>(m); m-><a href="qwidget.html#show">show</a>(); qApp-><a href="qapplication.html#setMainWidget">setMainWidget</a>(0);}void <a name="f600"></a>Main::clear(){ editor->clear();}void <a name="f601"></a>Main::help(){ static QMessageBox* about = new <a href="qmessagebox.html">QMessageBox</a>( "Qt Canvas Example", "<h3>The QCanvas classes example</h3>" "<ul>" "<li> Press ALT-S for some sprites." "<li> Press ALT-C for some circles." "<li> Press ALT-L for some lines." "<li> Drag the objects around." "<li> Read the code!" "</ul>", QMessageBox::Information, 1, 0, 0, this, 0, FALSE ); about->setButtonText( 1, "Dismiss" ); about->show();}void <a name="f602"></a>Main::aboutQt(){ QMessageBox::<a href="qmessagebox.html#aboutQt">aboutQt</a>( this, "Qt Canvas Example" );}void <a name="f603"></a>Main::toggleDoubleBuffer(){<a name="x2714"></a> bool s = !options-><a href="qmenudata.html#isItemChecked">isItemChecked</a>(dbf_id); options-><a href="qmenudata.html#setItemChecked">setItemChecked</a>(dbf_id,s);<a name="x2687"></a> canvas.<a href="qcanvas.html#setDoubleBuffering">setDoubleBuffering</a>(s);}void <a name="f604"></a>Main::enlarge(){<a name="x2686"></a><a name="x2685"></a> canvas.<a href="qcanvas.html#resize">resize</a>(canvas.<a href="qcanvas.html#width">width</a>()*4/3, canvas.<a href="qcanvas.html#height">height</a>()*4/3);}void <a name="f605"></a>Main::shrink(){ canvas.<a href="qcanvas.html#resize">resize</a>(canvas.<a href="qcanvas.html#width">width</a>()*3/4, canvas.<a href="qcanvas.html#height">height</a>()*3/4);}void <a name="f606"></a>Main::rotateClockwise(){<a name="x2707"></a> <a href="qwmatrix.html">QWMatrix</a> m = editor-><a href="qcanvasview.html#worldMatrix">worldMatrix</a>();<a name="x2731"></a> m.<a href="qwmatrix.html#rotate">rotate</a>( 22.5 );<a name="x2706"></a> editor-><a href="qcanvasview.html#setWorldMatrix">setWorldMatrix</a>( m );}void <a name="f607"></a>Main::rotateCounterClockwise(){ <a href="qwmatrix.html">QWMatrix</a> m = editor-><a href="qcanvasview.html#worldMatrix">worldMatrix</a>(); m.<a href="qwmatrix.html#rotate">rotate</a>( -22.5 ); editor-><a href="qcanvasview.html#setWorldMatrix">setWorldMatrix</a>( m );}void <a name="f608"></a>Main::zoomIn(){ <a href="qwmatrix.html">QWMatrix</a> m = editor-><a href="qcanvasview.html#worldMatrix">worldMatrix</a>();<a name="x2732"></a> m.<a href="qwmatrix.html#scale">scale</a>( 2.0, 2.0 ); editor-><a href="qcanvasview.html#setWorldMatrix">setWorldMatrix</a>( m );}void <a name="f609"></a>Main::zoomOut(){ <a href="qwmatrix.html">QWMatrix</a> m = editor-><a href="qcanvasview.html#worldMatrix">worldMatrix</a>(); m.<a href="qwmatrix.html#scale">scale</a>( 0.5, 0.5 ); editor-><a href="qcanvasview.html#setWorldMatrix">setWorldMatrix</a>( m );}void <a name="f610"></a>Main::mirror(){ <a href="qwmatrix.html">QWMatrix</a> m = editor-><a href="qcanvasview.html#worldMatrix">worldMatrix</a>(); m.<a href="qwmatrix.html#scale">scale</a>( -1, 1 ); editor-><a href="qcanvasview.html#setWorldMatrix">setWorldMatrix</a>( m );}void <a name="f611"></a>Main::moveL(){ <a href="qwmatrix.html">QWMatrix</a> m = editor-><a href="qcanvasview.html#worldMatrix">worldMatrix</a>();<a name="x2733"></a> m.<a href="qwmatrix.html#translate">translate</a>( -16, 0 ); editor-><a href="qcanvasview.html#setWorldMatrix">setWorldMatrix</a>( m );}void <a name="f612"></a>Main::moveR(){ <a href="qwmatrix.html">QWMatrix</a> m = editor-><a href="qcanvasview.html#worldMatrix">worldMatrix</a>(); m.<a href="qwmatrix.html#translate">translate</a>( +16, 0 ); editor-><a href="qcanvasview.html#setWorldMatrix">setWorldMatrix</a>( m );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -