QMainWindow قسمت هفتم
کار با دیالوگ های استاندارد و فایل ها

سلام دوستان امید وارم که صبح خوبی رو شروع کرده باشید .

در این قسمت قصد داریم اسلات های save و open رو درست کنیم. خوب در این صورت به یک سری کلاس هایی بر میخوریم که در کیوتی با نام Standard Dialogs شناخته میشند . دیالوگ های استاندارد مجوعه ای از کلاس ها هستند که ما رو برای انجام برخی از کارهای استاندارد یاری میکنند . مثلا اگه شما نیاز به گرفتن یه فونت دارین برای یه جای برنامه تون کیوتی کلاسی داره که شما رو برای انتخاب یه فونت راحت میکنه . یا اگه تو برنامه تون نیاز دارین که انتخاب یه رنگ به کاربر سپرده بشه . خوب بهترین کار ممکن اینه که یه پالت رنگ به کاربر نمایش بدین و بعدش بخواین که رنگو انتخاب کنه . باز هم دیالوگی برای این کار هست. اما دیالوگ استانداردی که ما در این قسمت نیاز داری دیالوگ گرفتن یه آدرس برای باز کردن متنیش در برنامه است . همچنین نیاز به دیالوگی داریم که یه آدرس به ما برای ذخیره فایلمون بده. در ضمن در این قسمت نیاز به کار با فایل ها بدر کیوتی داریم . برای کاربا فایل ها در کیوتی کلاس هایی تعبیه شده که اساس همگی اونا کلاسی است به نام QIODevice .

خوب اسلات openDocument تا اینجا به صورت زیر خواهد بود


void QNotePad::openDocument()
{
QString fileName =
QFileDialog::getOpenFileName(this, "Open", "", "Text Files (*.txt);;All Files(*.*)" );
if( !QFile::exists(fileName))
return;

QFile file(fileName );

if (!file.open(QFile::ReadOnly | QFile::Text)) {
QMessageBox::warning(this, tr("Application"),
tr("Cannot read file %1:\n%2.")
.arg(fileName)
.arg(file.errorString()));
return;
}
QTextStream in(&file);
m_plainTextEdit->setPlainText(in.readAll());

}

دیالوگ استانداردی که در این قسمت استفاده میشه QFileDialog هستش که تابع استاتیکی برای گرفتن یه مسیر برای باز کردن از کاربر به کار میره . با اجرای این تابع یک دیالوگ به کاربر نمایش داده میشه و از اون خواسته میشه که آدرس فایل مورد نظرش رو وارد کنه. پارامتر های این تابع : اولی پدرش . دومی عنوان caption دیالوگ نمایش داده شده. سومین پارامتر : مسیری که با نمایش دیالوگ به صورت پیش فرض نمایش داده بشه. و چهارمی فیلتر فایل های نمایش داده شده است .

برای کار با فایل ها در کیوتی سه تا کلاس پر کاربرد داریم یکی QFile و QTextStream و QDataStream . خوب با اولی میتونید یه فایل رو باز کنید و حتی با استفاده از توابعش تو اون فایل بنویسید یا ازش بخونید.کلاس QTextStream در واقع یه اینترفیس روی QFile هستش برای راحت کار کردن با خواندن ونوشتن در فایل های متنی و خوب QDataStream هم همینطور فقط با این تفاوت که برای فایل های باینری به کار میره . باز هم میگم شما برای خوندن یا نوشتن در یه فایل فقط نیاز به QFile دارین . ولی برای راحتتر کار کردن با فایل ها توصیه میشه با استفاده از QTextStream و QDataStream به مقاصدتون برسید.
خوب من از تابع استاتیک exist عضو کلاس QFile استفاده کردم تا تشخیص بدم آیا این فایل معتبره یا نه . (‌ممکنه کاربر اصلا دکمه cancel رو کلیک کنه که در این صورت فایل قابل باز شدن نیست )
در مرحله بعد از کلاس QFile بنده یک شی با ارسال آدرس فایل به سازندش ساختم .
در قسمت بعدی اونو بازش کردم با استفاده از تابع open . به این تابع گفتم که میخوام فایلم به صورت فقط خواندنی QFile::ReadOnly و به صورت متنی QFile::Text باز بشه و چون این ها پرچم هستند قابلیت or شدن باهم رو دارند. اما اگه تابع open با شکست مواجه شد. مقدار بازگشتیش false خواهد بود که ما با استفاده از QMessageBox اینو به اطلاع کاربر میرسونیم .

اما یه نکته خیلی کاربردی : در اشیایی که QString هستند یا QString برمیگردونن مثل tr ( باز هم همون QString مورد بحث خواهد بود ) میشود از تابع arg عضو کلاس QString استفاده های خیلی خوبی برد. این تابع متن فعلی QString ای که با اون فراخونده شده رو میگره و جای number% پارامتری که براش ارسال شده رو میذاره . اینکه کدوم number با پارامتر ما جایگزین بشه بستگی به این داره که ما در مرتبه چندم از .arg() استفاده کردیم .



QMessageBox::warning(this, tr("Application"),
tr("Cannot read file %1:\n%2.")
.arg(fileName)
.arg(file.errorString()));


مثلا در این جا درصد یک با fileName جایگزین میشه . درصد دو با خروجی تابع errorString . این تابع آخرین خطای یه QFile رو به صورت QString بر میگردونه .تابع .arg عضو کلاس QString بسیار پرکاربرد است . به خصوص در برنامه نویسی برای پایگاه های داده.


QTextStream in(&file);
m_plainTextEdit->setPlainText(in.readAll());

در این قسمت از کد هم ما یه QTextStream برای کار کردن راحت تر با فایل ساختیم و بعد با استفاده از تابع readAll اون که تمام متن یه فایل رو به صورت یه QString برمیگردونه و استفاده از setPlainText عضو کلاس تکست ادیتمون به نتیجه دلخواه رسیدیم.
خسته نباشید .اسلات save برای بعد .