PDA

View Full Version : سوال: درخواست توضیحات برای sizePolicy و sizeHint



woeful
سه شنبه 03 اسفند 1389, 00:23 صبح
سلام
بازم من اومدم :لبخند:

اگه میشه یه توضیح در مورد این متد های setSizePolicy و sizeHints و کلا در مورد اندازه و .... و parent , child و .... به من بدین البته درسته که نباید این سوالو بپرسم وخودم سرچ کنم ولی من این موضوعات رو خوندم ولی english و چندان متوجه نشدم .

یه سوال توی حاشیه بپرسم >> چرا انجمن QT اینقد سوتو کوره :ناراحت: یعنی من دارم یه زبون برنامه نویسی خوب یاد میگیرم یا نه ؟:ناراحت:

با تشکر
weoful

.:saeed:.
سه شنبه 03 اسفند 1389, 02:39 صبح
یه سوال توی حاشیه بپرسم >> چرا انجمن QT اینقد سوتو کوره :ناراحت: یعنی من دارم یه زبون برنامه نویسی خوب یاد میگیرم یا نه ؟:ناراحت:
اول بگم که دل قوی دار که داری خوب چیزی رو یاد میگیری . اینم بگم که شما زبان جدیدی یاد نمیگیرید . در واقع دارین برنامه نویسی سی پلاس پلاس را تمرین میکنید و بهتر یاد میگیرید . اگه واسه کار دارین یاد میگیرید بدونید که حتما براتون کار پیدا میشه ( البته وقتی که خوب یادش گرفتید ) اگه نشد منو خبر کنید براتون سراغ دارم:لبخند:. اما اینکه چرا اینجا سوت و کوره . خودم هم قبلا این اعتراض را کردم ولی بعد دیدم انجمن های دیگه هم خیلی فعال نیستند . بهتره یه سری بزنید . از میان اونا فقط سی و سی پلاس پلاس فعالترند که بیشتر سوالات ، سوالات دانشجوییه . پس نگران اینم نباشید.
اما sizePolicy ها :
با تعیین یه سایز پالیسی برای یه ویدجت در واقع تعیین میکنید که این ویدجت در یک layout ( وقتی که رو پدرش قرار داره )در مقابل تغییرات اندازه چه واکنشی داشته باشد.
مهمتریناش اینا هستند :
QSizePolicy::Fixed با انتخاب این سایز پالیسی شما درواقع دستور میدهید که ویدجت شما به هیچ وجه با تغییر اندازه پدرش ، تغییر اندازه نده . مثل همون QProgressBar که دیدیم . با تغییر اندازه QMainWindow تغییر اندازه ای در QProgressBar مشاهده نمیکنیم.



QHBoxLayout *lay = new QHBoxLayout;
QPushButton *btn = new QPushButton; lay->addWidget( btn ); btn->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ); btn->setMinimumSize( 100, 200 ); QWidget *wdg = new QWidget; wdg->setLayout( lay ); wdg->show();
دکمه کد بالا دیگه به هیچ وجه با تغییر اندازه پدرش ، ( همون wdg ) تغییر اندازه نمیده .با استفاده از دوتا تابع میتونی برای هر ویدجتی حد اقل و حد اکثر سایز تعیین کنی . setMinimumSize و setMaximumSize که ما در اینجا با تابع اولی گفتیم که حداقل اندازه ای که این دکمه باید داشته باشه 100 *200 هستش .از طرفی گفتیم که باید سایزش فیکس باشه . پس اندازش همین قدر میمونه .

QSizePolicy::Preferred:
بهرین اندازه برای این ویدجت توسط تابع sizeHint ( این تابع مورد نیاز شما نیست . بلکه layout از اون برای تعیین اندازه ویدجت استفاده میکنه ) برگردونده میشه . ویدجت میتونه کوچکتر و بزرگتر از مقداری که توسط این تابع برگردونده شده بشه ولی بزرگ تر شدنش زیاد مناسب نیست .

QSizePolicy::Expanding
ویدجت پسر میتواند در صورتی که پدر بزرگ تر شد و جای خالی هم بود کاملا گسترش پیدا کند . مثلا seek bar یه مدیاپلیر

بقیه رو هم خودتون یه امتحانی بکنید چون ساعت سه شبه و من دیگه دارم از حال میرم اگه سوالی داشتید حتما بپرسید. در ضمن مفهوم child , parent در آموزش کیوتی به زبان ساده کاملا توضیح داده شد . فقط همین قدر بگم که اشیاء کلاس هایی که از QObject ارث برده اند میتوانند یک QObject را به عنوان پدر خود در نظر بگیرند . در مورد widget ها هم همین طور اما برای اونا پدری از جنس QWidgetیا کلاس های مشتق شده از QWidget تعیین میکنیم . وقتی یک شی پدر داشته باشد و در ضمن با new هم ایجاد شده باشد موقع مرگ پدر ، او نیز از بین خواهد رفت . یعنی دیگه شما لازم نیست نگران delete کردن اون باشید.

woeful
سه شنبه 03 اسفند 1389, 15:40 عصر
سلام
آقا سعید دست شما درد نکنه واقعا ممنون

QSizePolicy::Expanding
ویدجت پسر میتواند در صورتی که پدر بزرگ تر شد و جای خالی هم بود کاملا گسترش پیدا کند . مثلا seek bar یه مدیاپلیر


در ادامه این مطب یه سوال :

من کد زیر رو داخل سازنده کلاس MainWindow نوشتم :

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QTabBar *btab = new QTabBar(this);
btab->setSizePolicy(QSizePolicy::Preferred,QSizePolicy:: Preferred);
btab->addTab("text1");
btab->addTab("text2");
btab->addTab("text3");

}

اما این TabBar من فقط به گوشه بالا سمت چپ چسبده و گسترش پیدا نمیکنه (مدونم یه جای کارم میلنگه :ناراحت: ولی کجاش )

.:saeed:.
سه شنبه 03 اسفند 1389, 17:57 عصر
سلام .
مطالبی که گفتم رو دقیق نخوندی . در ضمن به آموزش کیوتی هم که توی همین انجمنه نگاه نکردی .
باید به عرضت برسونم که کلاس QMainWindow دارای تابعی به نام setCentralWidget هستش که برای تعیین یک ویدجت به عنوان هسته مرکزی و در واقع قلب یک main window به کار میره . پس توی کد بالا بنویس setCentralWidget(btab);
اما اگه این کار و نخواستی بکنی و خواستی از سایز پالیسی ها استفاده کنی : باید از layout ها استفاده کنی . چون اصلا تابع sizeHint در مواقعی که ویدجت شما توی layout باشه مقدار متناسب با سایز پالیسی رو بر میگردونه .پس در بالا اگه میخواین کدتون درست اجرا بشه و همونی باشه که خودتون میخواید اون tab bar رو بذارید توی یک layout و بعد اون layout رو به main window تون نسبت بدین . سعی کنید انجام بدین واگه مشکلی بود از پرسیدنش دریغ نکنید.

.:saeed:.
سه شنبه 03 اسفند 1389, 17:58 عصر
در پست دوم دقیقا این جمله رو آوردم که :

با تعیین یه سایز پالیسی برای یه ویدجت در واقع تعیین میکنید که این ویدجت در یک layout ( وقتی که رو پدرش قرار داره )در مقابل تغییرات اندازه چه واکنشی داشته باشد.
پس سعی کن با دقت جملات رو بخونی . البته گفتم که با وجود تابع setCentralWidget دیگه نیازی به این کارا نیست.