PDA

View Full Version : معرفی اجمالی Graphics view Framework



.:saeed:.
سه شنبه 22 تیر 1389, 23:19 عصر
با سلام خدمت دوستان عزیز
در این تاپیک قصد دارم یکی از جالبترین مجموعه کلاس های کیوتی برای کار گرافیکی دو بعدی رو به صورت مختصر توضیح بدم.

این کلاس طبق help کیوتی و مثالی که داره قدرت بالایی برای کار با تعداد زیادی از اشیاء داره. درسته اشیاء . در این فریم ورک هر چیزی که میخواید رسم کنید رو باید به چشم یه شی بهش نگاه کنید . که البته میتونه singal و slot هم داشته باشه.
برای نمونه عکس یه بازی که با این مجموعه ساختم رو توی تصاویر ضمیمه میتونین ببینین


خوب شروع میکنیم.


در برنامه نویسی گرافیکی ( در این آموزش ها فقط دو بعدی منظوره ، برا سه بعدی کیوتی با اپن جی ال جوابگو هست ) شما با سه مفهوم کلی و مهم روبرو هستید .

1.سن Scene
2.view
3.item

1.Scene
سن رو مثل یه صفحه کاغذ فرض کنید یا بهتر بگم یه چرک نویس که طرح اولیه تون رو روی اون میکشین . در واقع سن یه مفهوم logical هست نه physical

2.Item
ایتم ها همون اشیایی هستند که رو سن اونارو رسم می کنین.

3.view
حالا که Item ها تون رو روی سن کشیدید اونو با یه view به صورت فیزیکی نمایش می دین.
پس scene شد نقشه ما ، items شدند اشیای درون نقشه ما و view شد خانه ساخته شده از نقشه.

.:saeed:.
سه شنبه 22 تیر 1389, 23:42 عصر
خوب حالا می ریم سراغ برنامه نویسی
اول سن ها

برای کار با سن نیازه که فایل QGraphicsScene رو include کنید



QGraphicsScene::QGraphicsScene ( const QRectF (http://barnamenevis.org/forum/qrectf.html) & sceneRect, QObject (http://barnamenevis.org/forum/qobject.html) * parent = 0 )



من معمولا برای ساختن یه سن از سازنده بالا استفاده می کنم.
خوب یه چیزی بالا نامفهومه اونم sceneRect هستش .
اولا نوع این پارامتر مهمه که از نوع QRectF هستش . QRectF مشخص کننده یه مستطیل هستش و اون F پایانی اش به این دلیله که توی این فریم ورک مختصات به صورت float بیان میشه نه int
این پارامتر مشخص کننده محدوده scene شما خواهد بود که بعد view از اون برای رندر کردن اشیاء موجود در این مستطیل استفاده میکند.
اگه هم دوست ندارین میتونین مستطیل سن رو مشخص نکنید . اون وقت با توجه به ایتم هایی که به سن اضافه کردین خود سن بزرگترین مستطیل ممکن رو برای سن رکت تعیین می کنه.

پس کد کامل به این صورته:



QGraphicsScene *scene = new QGraphicsScene( QRectF(0,0,200,200 );


کد بالا یه سن به ابعاد 200px در 200px ایجاد میکنه.
0 و 0 اون موجود در QRectF هم نقطه مبدا رو مشخص میکنه . یعنی اینکه بعد که قراره ما این سن رو با یه view نمایش بدیم ، و view یه widget هستش ، نقطه 0,0 سن با نقطه 0و0 در view منطبق هستش . برای درک بهتر اگه ما به جای صفر و صفر در Qrectf ده و ده می گذاشتیم ، اون وقت نقطه صفر وصفر view ( گوشه بالا سمت چپ ) با مختصات ده و ده سن منطبق می شد. ( مهم نیست اگه نفهمیدین )

.:saeed:.
سه شنبه 22 تیر 1389, 23:45 عصر
خوب حالا view
اون include کنید QGraphicsView را !

این قسمت زیاد دردسر نداره


QGraphicsView view( &scene );
view.show();


همین ! scene هم همون سنی بود که قبلا ساختی.

.:saeed:.
چهارشنبه 23 تیر 1389, 00:02 صبح
و اما ایتم ها




Qt خداراشکر چند آیتم آماده و به قول معروف primitive داره مثل دایره ، مستطیل و ...

QGraphicsEllipseItem (http://barnamenevis.org/forum/qgraphicsellipseitem.html) بیضی
QGraphicsLineItem (http://barnamenevis.org/forum/qgraphicslineitem.html) خط
QGraphicsPixmapItem (http://barnamenevis.org/forum/qgraphicspixmapitem.html)تصویر
QGraphicsPolygonItem (http://barnamenevis.org/forum/qgraphicspolygonitem.html) چند ضلعی
QGraphicsRectItem (http://barnamenevis.org/forum/qgraphicsrectitem.html)مستطیل
QGraphicsSimpleTextItem (http://barnamenevis.org/forum/qgraphicssimpletextitem.html) متن ساده
QGraphicsTextItem (http://barnamenevis.org/forum/qgraphicstextitem.html) متن پیشرفته
Scene چند تا تابع برای اضافه کردن این ایتم ها به خودش داره مثلا :



QGraphicsEllipseItem * addEllipse ( const QRectF & rect, const QPen & pen = QPen(), const QBrush & brush = QBrush() )

QGraphicsEllipseItem * addEllipse ( qreal x, qreal y, qreal w, qreal h, const QPen & pen = QPen(), const QBrush & brush = QBrush() )

QGraphicsLineItem * addLine ( const QLineF & line, const QPen & pen = QPen() )
QGraphicsLineItem * addLine ( qreal x1, qreal y1, qreal x2, qreal y2, const QPen & pen = QPen() )

QGraphicsPathItem * addPath ( const QPainterPath & path, const QPen & pen = QPen(), const QBrush & brush = QBrush() )

QGraphicsPixmapItem * addPixmap ( const QPixmap & pixmap )

QGraphicsPolygonItem * addPolygon ( const QPolygonF & polygon, const QPen & pen = QPen(), const QBrush & brush = QBrush() )

QGraphicsRectItem * addRect ( const QRectF & rect, const QPen & pen = QPen(), const QBrush & brush = QBrush() )

QGraphicsRectItem * addRect ( qreal x, qreal y, qreal w, qreal h, const QPen & pen = QPen(), const QBrush & brush = QBrush() )

QGraphicsSimpleTextItem * addSimpleText ( const QString & text, const QFont & font = QFont() )

QGraphicsTextItem * addText ( const QString & text, const QFont & font = QFont() )


می تونید هم اول یه ایتم رو جدا گونه بسازید و بعد با تابع addItem سن اونارو به سن اضافه کنید. ایتم های دلخواه رو هم میتونید خودتون بسازید که بعدا بحث می کنیم.

نکته مهم اینه که هر ایتمی دستگاه مختصات مربوط به خودش رو داره که از نقطه گوشه چپ بالا به عنوان مبدا شروع می شه به پایین.( بعدا بیشتر میگم )
فعلا.:قلب:

.:saeed:.
چهارشنبه 23 تیر 1389, 00:07 صبح
اینم یه نمونه ساده



#include<QtGui/QApplication>
#include<QGraphicsItem>
#include<QGraphicsView>
#include<QGraphicsScene>
intmain(intargc, char *argv[])
{
QApplicationa(argc, argv);
QGraphicsScenescene( 0, 0, 100, 30 );
scene.addEllipse( -20, -10, 100, 30 );
QGraphicsViewview( &scene );
scene.addSimpleText("Hello World!");
view.show();
returna.exec();
}

http://barnamenevis.org/forum/attachment.php?attachmentid=52852&stc=1&d=1279051821