آموزش کیوت - قسمت هفتم
معرفی و کار با لایه های افقی و عمودی
در رابطه با این قسمت یکم توضیحاتی بدم که هدف چه چیزی هست و بعد بریم سراغ آموزش.
خب تاحالا شنیدین و دیدین که در نرم افزار ها تنظیمات پنجره ها و همچنین لایه ها توسط Re-size شدن صورت میگیرن و در عین تغییر اندازه آبجکت ها و کنترل های موجود بر روی فرم متناسب با تغییرات اندازه به خوبی تغییر میکنند در این حالت ما میگیم تمامی کنترل های موجود روی لایه تنظیم شده اند.
برای شروع پروژه ای رو ایجاد میکنم و نامش رو میزارم MyLayout میتونیم این پروژه رو بدون widget هم ایجاد کنیم چون در این مرحله از کد نویسی برای ایجاد فرم و لایه ها استفاده خواهیم کرد.
ببینید قبل از هر چیزی من میخوام یک فرمی به عنوان پنجره ایجاد کنم و همچنین کنترل های لازم رو بر روی اون فراخوانی خواهم کرد.
برای این کار ما باید موارد لازم رو Include کنیم که در این مرحله ما نیاز به کلاس QWidget و QPushButton و QHBoxLayout و QVBoxLayout هستیم.
حالا چطوری از این موارد استفاده خواهیم کرد به صورت زیر هستش.
ابتدا من اقدام به ساختن فرمم میکنم توسط کد زیر :
QWidget *window = new QWidget;
window->setWindowTitle("Window Layout");
در این کد من یه نمونه از QWidget میگیرم و نامش رو window میزارم و در خط بعدیش عنوانی برای این فرم خودم توسط خاصیت setWindowsTitle براش در نظر میگیرم.
حالا میخوام 3 تا دکمه در فرمم قرار بدم به صورت زیر برای هر کدوم از QPushButton نمونه میگیرم.
QPushButton *button = new QPushButton("Button One");
QPushButton *button1 = new QPushButton("Button Two");
QPushButton *button2 = new QPushButton("Button Three");
ببینید در هر 3 تا خط هم من 3 تا نمونه گرفتم با نام های مختلف ولی همشون از نوع دکمه یا همان Button هستند.
حالا من اگه فرم رو همینجوری show کنم دکمه های نمونه گرفته شده من در داخل فرم نمایش داده نخواهند شد و فرم من به صورت پیشفرض در حداکثر اندازه نمایش داده خواهد شد ! ولی هدف من اینه که به کمک کلاس های افقی و یا عمودی Button ها رو در داخل فرم نمایش بدم و هچنین در این حالت اندازه فرم من بر اساس این کلاس متناسب با 3 دکمه نمونه گرفته شده در داخل لایه Re-Size خواهد شد.
بر اساس نیاز نوع لایه رو انتخاب میکنیم که عمودی باشه یا افقی...
من لایه افقی رو انتخاب میکنم و ازش به صورت زیر نمونه میگیرم :
QHBoxLayout *hlayout = new QHBoxLayout;
حالا تا اینجا لایه من ساخته شده ولی بازهم در این مرحله چیزی نمایش داده نخواهد شد برای این امر باید به صورت زیر کنترل های خودم رو بر اساس لایه تعریف شده صدا بزنم.
hlayout->addWidget(button);
hlayout->addWidget(button1);
hlayout->addWidget(button2);
دقت کنید ... اینجا من میگم دکمه 1..2...3 رو هر 3 تاشون رو به لایه من اضافه کن.
حالا تا اینجا کنترل های من به لایه اختصاص داده شده ولی خود لایه یه موردی داره !!! اونم اینه که برای نمایش لایه در داخل window که از نوع QWidget در نظر گرفتم نمایش داده نخواهد شد ! پس باید چکار کنم ؟ خب خیلی راحت باید من لایه ای که تعریف کردم رو به window تخصیص بدم به صورت زیر...
window->setLayout(hlayout);
و در انتها برای اینکه فرم من به نمایش در بیاد باید به صورت زیر این کد رو هم فراموش نکنم :
window->show();
نتیجه این کارا میشه به صورو زیر :
و
و اگه از حالت عمودی استفاده کنیم به صورت زیر کد ها تغییر میکنند :
QVBoxLayout *vlayout = new QVBoxLayout;
vlayout->addWidget(button);
vlayout->addWidget(button1);
vlayout->addWidget(button2);
window->setLayout(vlayout);
خروجی :
و
کد کلی به صورت زیر :
#include "mainwindow.h"#include <QApplication>#include <QPushButton>#include <QHBoxLayout>#include <QVBoxLayout>int main(int argc, char *argv[]){QApplication a(argc, argv);QWidget *window = new QWidget;window->setWindowTitle("Window Layout");QPushButton *button = new QPushButton("Button One");QPushButton *button1 = new QPushButton("Button Two");QPushButton *button2 = new QPushButton("Button Three");QHBoxLayout *hlayout = new QHBoxLayout;hlayout->addWidget(button);hlayout->addWidget(button1);hlayout->addWidget(button2);window->setLayout(hlayout);window->show();return a.exec();}