ورود

View Full Version : سوال: روش انتقال دیتا - QDialog, QMainWindow



UnnamE
دوشنبه 16 خرداد 1390, 05:42 صبح
یه سوال سادست
من فرم های برنامه رو با Designer طراحی کردم
فایل های هدر فرم ها هم دسترسی به Ui کلاس رو private ست میکنه که اون رو Public کردم
public:
explicit AddNameDialog(QWidget *parent = 0);
~AddNameDialog();
Ui::AddNameDialog *ui;

به عنوان مثال واسه برگردوندن ورودی یک QLineEdit به QListWidget اول کلاس های دیالوگ رو include کردم
#include "ui_addnamedialog.h"
#include "addnamedialog.h"

واسه Slot
void AddBook::on_actionAdd_triggered()
{
AddNameDialog dlg(this);
if(dlg.exec() == QDialog::Accepted){
QListWidgetItem *newItem = new QListWidgetItem(dlg.ui->nameEdit->text());
ui->list->addItem(newItem);
}
}

نمیدونم این روش درستی هست یا نه
ممنون میشم راهنمایی کنید !

glassysmart
دوشنبه 16 خرداد 1390, 10:22 صبح
لطفا مشکل را با جزئیات شرح دهید

UnnamE
دوشنبه 16 خرداد 1390, 16:20 عصر
لطفا مشکل را با جزئیات شرح دهید
مشکلی ندارم تو این کار
فقط راه درست انجام اش رو نمیدونم، یعنی واسه اینکه یک مقدار رو بین دیالوگ و QMainWindow جابه جا کنیم همین راه درست ترینه؟
آخه فک نکمک نیاز باشه هدر ها رو انکلود کرد به این شکل

mousamk
دوشنبه 16 خرداد 1390, 17:17 عصر
این روش شما کار میکنه ولی میدونین که public کردن عناصر private برخلاف اصول شی گرایی هست.
بهتر است برای مقادیری که قرار است در بیرون از کلاس، دسترسی به آنها داشته باشید، متد getter تعریف کنید و از طریق آن بگیرید.

یعنی در مثال شما به جای public کردن ui، بهتر است در کلاس مربوط به Dialog یک متد مثلا با اسم getName تعریف کنید که متن lineEdit را برمیگرداند:


QString AddNameDialog::getName()
{
return ui->nameEdit->text()
}


سپس تابع استفاده را هم بدین شکل تغییر دهید:


void AddBook::on_actionAdd_triggered()
{
AddNameDialog dlg(this);
if(dlg.exec() == QDialog::Accepted){
QListWidgetItem *newItem = new QListWidgetItem(dlg.getName());
ui->list->addItem(newItem);
}
}


اکنون هم اصول مهم شی گرایی مثل encapsulation را رعایت کرده اید که نتیجه مثبت این رعایت را بعدا اگه نیاز به تغییر کد داشتید، حس خواهید کرد. (مثلا اگر اسم lineEdit را تغییر دهید یا از یک ویجت دیگر استفاده کنید، نیازی نخواهد بود که بیرون از کلاس هم تغییر داده شود) و هم این که دیگر نیازی به include کردن فایل ui_addanmedialog.h نیست. (یعنی باز هم رعایت encapsulation و این که کلاس main window شما نیازی ندارد که از ساختار کلاس Ui::AddNameDialog خبردار شود و احتمالا در آینده تغییرات آن کلاس به اینجا هم منتشر شوند.)

UnnamE
دوشنبه 16 خرداد 1390, 19:46 عصر
اکنون هم اصول مهم شی گرایی مثل encapsulation را رعایت کرده اید که نتیجه مثبت این رعایت را بعدا اگه نیاز به تغییر کد داشتید، حس خواهید کرد. (مثلا اگر اسم lineEdit را تغییر دهید یا از یک ویجت دیگر استفاده کنید، نیازی نخواهد بود که بیرون از کلاس هم تغییر داده شود) و هم این که دیگر نیازی به include کردن فایل ui_addanmedialog.h نیست. (یعنی باز هم رعایت encapsulation و این که کلاس main window شما نیازی ندارد که از ساختار کلاس Ui::AddNameDialog خبردار شود و احتمالا در آینده تغییرات آن کلاس به اینجا هم منتشر شوند.)
بله بله دقیقا منظورم همین بود
+ اینکه getter رو در کلاس AddNameDialog باس public کرد
public:
explicit AddNameDialog(QWidget *parent = 0);
~AddNameDialog();
QString getName();
هنوز کمی pythonic فک میکنم، واسه همین با ++C لنگ میزنم :بامزه:
مرسی