1 ضمیمه
معرفی اجمالی Graphics view Framework
با سلام خدمت دوستان عزیز
در این تاپیک قصد دارم یکی از جالبترین مجموعه کلاس های کیوتی برای کار گرافیکی دو بعدی رو به صورت مختصر توضیح بدم.
این کلاس طبق help کیوتی و مثالی که داره قدرت بالایی برای کار با تعداد زیادی از اشیاء داره. درسته اشیاء . در این فریم ورک هر چیزی که میخواید رسم کنید رو باید به چشم یه شی بهش نگاه کنید . که البته میتونه singal و slot هم داشته باشه.
برای نمونه عکس یه بازی که با این مجموعه ساختم رو توی تصاویر ضمیمه میتونین ببینین
خوب شروع میکنیم.
در برنامه نویسی گرافیکی ( در این آموزش ها فقط دو بعدی منظوره ، برا سه بعدی کیوتی با اپن جی ال جوابگو هست ) شما با سه مفهوم کلی و مهم روبرو هستید .
1.سن Scene
2.view
3.item
1.Scene
سن رو مثل یه صفحه کاغذ فرض کنید یا بهتر بگم یه چرک نویس که طرح اولیه تون رو روی اون میکشین . در واقع سن یه مفهوم logical هست نه physical
2.Item
ایتم ها همون اشیایی هستند که رو سن اونارو رسم می کنین.
3.view
حالا که Item ها تون رو روی سن کشیدید اونو با یه view به صورت فیزیکی نمایش می دین.
پس scene شد نقشه ما ، items شدند اشیای درون نقشه ما و view شد خانه ساخته شده از نقشه.
نقل قول: معرفی اجمالی Graphics view Framework
خوب حالا می ریم سراغ برنامه نویسی
اول سن ها
برای کار با سن نیازه که فایل QGraphicsScene رو include کنید
QGraphicsScene::QGraphicsScene ( const QRectF & sceneRect, QObject * 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 ( گوشه بالا سمت چپ ) با مختصات ده و ده سن منطبق می شد. ( مهم نیست اگه نفهمیدین )
نقل قول: معرفی اجمالی Graphics view Framework
خوب حالا view
اون include کنید QGraphicsView را !
این قسمت زیاد دردسر نداره
QGraphicsView view( &scene );
view.show();
همین ! scene هم همون سنی بود که قبلا ساختی.
نقل قول: معرفی اجمالی Graphics view Framework
و اما ایتم ها
Qt خداراشکر چند آیتم آماده و به قول معروف primitive داره مثل دایره ، مستطیل و ...
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 سن اونارو به سن اضافه کنید. ایتم های دلخواه رو هم میتونید خودتون بسازید که بعدا بحث می کنیم.
نکته مهم اینه که هر ایتمی دستگاه مختصات مربوط به خودش رو داره که از نقطه گوشه چپ بالا به عنوان مبدا شروع می شه به پایین.( بعدا بیشتر میگم )
فعلا.:قلب:
1 ضمیمه
نقل قول: معرفی اجمالی Graphics view Framework
اینم یه نمونه ساده
#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();
}
https://barnamenevis.org/attach...1&d=1279051821