مرحله نوزدهم : معرفی و کار با TreeWidget
معرفی و کار با لیست های درختی / TreeWidget به این صورت است که در بسیاری از مواقع که مقادیر قابل انتخاب ما حاوی شاخه ها و زیر شاخه هایی هستند و برنامه نویس باید امکان این رو برای کابر فراهم کنه تا کاربر هم شاخه ها و هم زیر شاخه های بخشی رو که میخواد انتخاب کنه رو ببینه به طور کلی لیست انتخاب به صورت درختی نمایش داده خواهد شد.
به صورت زیر من لیستم رو ایجاد میکنم :
در رابطه با این شیئ باید اینمطور توضیح داد که خاصیت والد و فرزند رو در خودش تخصیص داده است برای مثال من نمونه زیر رو بخوام روی این لیست نمایش بدم به صورت زیر :
کتاب C++ 11
کلا یک والد یا زیر شاخه داریم و بقیه موارد زیر شاخه یا همان فرزند هستند در اصل همون Parent و Child
حالا روشی که من میخوام برای این بکار ببرم به صورت زیر خواهد بود ابتدا برای دسترسی و راحتی کار 2 تا تابع تعریف میکنم برای parent و child
در قسمت mainwindow.h پایینتر از Q_OBJECT
void AddRoot(QString name, QString Discreption);
void AddChild(QTreeWidgetItem * parent, QString name, QString Discreption);
خب اینجا من متد ها و همچنین نام و نوع تابع رو مشخص کردم که برای AddRoot یا همان والد نام و توضیحلات رو در نظر میگیرم و برای AddChild یا همان فرزند علاوه بر نام و توضیحات هر یک شناسه تعیین کننده برای شناساندن ایتم مورد نظر برای سر شاخه هستش و اونم از نوع QTreeWidgetItem قرار میدم.
مرحله بعد در فایل اصلیمون mainwindow.cpp توابع رو صدا زده و بدنه توابع رو میسازم به صورت زیر :
void MainWindow::AddRoot(QString name, QString Discreption)
{
}
void MainWindow::AddChild(QTreeWidgetItem* parent, QString name, QString Discreption)
{
}
حالا من به کد های زیر در داخل هریک از این دو تابع نیاز دارم به صورت زیر :
void MainWindow::AddRoot(QString name, QString Discreption)
{
QTreeWidgetItem * MyItem = new QTreeWidgetItem(ui->MyTreeWidget);
MyItem->setText(0, name);
MyItem->setText(1, Discreption);
ui->MyTreeWidget->addTopLevelItem(MyItem);
AddChild(MyItem, "C++", "Native / Objective");
AddChild(MyItem, "Java", "Objective");
}
void MainWindow::AddChild(QTreeWidgetItem* parent, QString name, QString Discreption)
{
QTreeWidgetItem * MyItem = new QTreeWidgetItem();
MyItem->setText(0, name);
MyItem->setText(1, Discreption);
parent->addChild(MyItem);
}
در تابع اول AddRoot ابتدا یک کپی از QTreeWidgetItem میسازم تا به عنوان آیتم های درختی برام کار کنه و در مرحله بعدی گفتم که در ایندکس اول یعنی 0 متنی رو که تابع میگیره رو ست کن و در خط بعدیش دقیقا مثل این گفتم توضیحات رو در ایندکس 1 یعنی دوم این رو ست کن و بعد از این گفتم لیست درختی من این دو گزینه رو از نوع آیتم های سر شاخه قرار بده با کد : addTopLevelItem این کار رو انجام میدم.
در خط بعدش اومدم گفتم ایتم های AddChild برابر باشه از آیتم های تعریف شده به صورت بالا که از تابع AddChild فراخوانی میشوند به صورت زیر ...
سه خط اول در تابع AddChild مثل تابع قبلی برای عنوان و شناسایی اینهاست و در خط آخر گفتم که آقا آیتم های والد من زیر مجموعشون برابر باشه با آیتم های فرزندی که ایجاد میشوند.
در مرحله بعد در قسمت فرم لود لازمه که تعداد ستون ها رو همراه با عناوینش مشخص کنم به صورت زیر :
ui->MyTreeWidget->setColumnCount(2);
AddRoot("Language", "Features");
مشخصه که گفتم دو ستون از نوع زبان و ویژگی های زبان درج کن و بعد از این تابع Addroot فراخوانی شده و تابع AddChild همینطور و نتیجه میشه به صورت زیر...
این مثال رو حتما از روی فایل ضمیمه شده بررسی کنید تا بهتر متوجه بشید.