QMainWindow قسمت هشتم
نوار وضعیت Status bar
بنام خدا
خوب در جلسه قبلی در مورد کار با فایل ها در کیوتی و همچنین کار با دیالوگ های استاندارد صحبت کردیم . این قسمت هم سعی داریم که اول اسلات save رو با هم بررسی کنیم و بعدش کار با status bar یا نوار وضعیت رو با هم بررسی کنیم.
void QNotePad::saveDocument()
{
QString fileName =
QFileDialog::getSaveFileName(this, "Open", "", "Text Files (*.txt);;All Files(*.*)" );
QFile file(fileName );
if (!file.open(QFile::WriteOnly | QFile::Text)) {
QMessageBox::warning(this, tr("Application"),
tr("Cannot write file %1:\n%2.")
.arg(fileName)
.arg(file.errorString()));
return;
}
QTextStream out(&file);
out << m_plainTextEdit->toPlainText();
}
همون طور که مشاهده میکنید گرفتن یه آدرس برای ذخیره یه فایل مثل بازکردنه . با تابع getSaveFileName که عضو کلاس QFileDialog هستش و در ضمن استاتیک هست این کار قابل انجام هست. بقیه کد هم که خیلی ساده هست هم تکراری است و هم چیزی برای گفتن نداره . در مورد toPlainText فقط توضیح بدم که چون textEdit ها میتونن متن با فرمت داشته باشند (Rich Text) به همین دلیل ممکنه متنشون ساده ساده هم نباشه . با استفاده از این تابع من در واقع دارم متن ساده رو بدست میارم یعنی متنی که هیچ فرمتی نداره .
Status Bar
هر main window ای به صورت پیش فرض حاوی یک نوار وضعیت برای نمایش پیغام ها و یا اطلاع رسانی ها میباشد. که با تابع statusBar() عضو کلاس QMainWindow قابل دسترسی هست.معمولا این پیغام ها در سه دسته طبقه بندی میشوند .
پیغام های موقتی: مثل وقتی که شما رو یکی از گزینه های منوی اکسپلورر تون میرین و متنی در پایین صفحه ظاهر میشه که توضیح دهنده کار این گزینه هست.
پیغام های معمولی : مثل تعداد نمایش تعداد خطوط یا تعداد کلمات در یک ویرایش گر متن.
پیغام های ثابت : این پیغام ها هیچ موقع از بین نمیروند . مثلا در بعضی از برنامه های پیغام ثابتی در status bar وضعیت caps lock رو نمایش میده.
پیغام های موقت Temporary Messages و پیغام های معمولی در سمت چپ یک statusbar ظاهر میشند و پیام های ثابت در سمت راست.
این نوار همچنین یک size grip هم برای ما فراهم کرده . مثلث سمت راستی که برای تغییر اندازه main window قابل استفاده هست. در ضمن با استفاده از تابع (setSizeGripEnabled(false میتونید اونو غیر فعال کنید.
خوب گفتیم که اگه شما از تابع QMainWindow::statusBar() استفاده کنید اشاره گری به status bar براتون برگردونده میشه . اگر هم شما status bar نداشتین این تابع یه status bar جدید ایجاد میکنه و اونو به main window تون اضافه کرده و اشاره گری به اون بر میگردونه .
خوب حالا هر یک از انواع پیام ها رو به صورت جزئی تر بررسی میکنیم.
پیام های موقتی : این پیغام ها برای مدت کوتاهی نمایش داده خواهند شد. این پیام ها با استفاده از QStatusBar::showMessage() که یک اسلات هست در status bar نمایش داده میشند و با استفاده از QStatusBar::clearMessage() پاک میشند. پیام موقت تا زمانی که از این تابع استفاده نشه یا متن جدیدی با showMessage به status bar نسبت داده نشه باقی خواهد ماند. اگه میخواهید که متن موقت شما برای یه مدت زمان ثابتی نمایش داده بشه مثلا ۵ ثانیه میتونید پارامتر دومی برای showMessage که البته اختیاری هم هست ارسال کنید. این عدد باید برحسب میلی ثانیه باشد.
پیغام های معمولی : خوب این پیغام ها به سادگی پیام های موقت نیست. شما باید برای استفاده از این نوع پیام از ویدجت ها استفاده کنید .اگه مثلا شما میخواید که یه متن ساده رو به عنوان یه پیام معمولی استفاده کنید باید اول یه شی از QLabel بسازین و بعد اونو به QStatusBar تون با استفاده از تابع addWidget اضافه کنید . شاید یکم پیچیده تر بشه ولی مزایای خاص خودشو داره. فرضا شما میتونید از آیکن ها در پیامتون استفاده کنید یا اینکه از نوار پیشرفت QProgressBar ( همون نوار های آبی رنگی که از ۰ تا ۱۰۰ پر میشه ) و یا هر ویدجت دیگه ای استفاده کنید.
هدر تابع addWidget( QWidget *widget, int stretch = 0 ) بیان گر اینکه شما باید یک یا دو پارامتر براش ارسال کنید . اولیش که خوب معلومه برای تعیین اشاره گر به ویدجت مد نظر هستش . نکته ای که هست مخرب QStatusBar خودش این ویدجت رو حذف میکنه (delete) . پس باید روی heap گرفته بشه.پارامتر دوم تعیین کننده اینه که فضای status bar چطور بین چند ویدجت های اضافه شده به satus bar تقسیم بشه. اگه شما مقدار صفر پیشفرض رو قبول کنید به این معناست که این ویدجت به اندازه ای که نیاز داره جا بر میداره. اعداد دیگر نسبت تقسیم فضا بین ویدجت ها رو مشخص میکنه . مثلا اگه شما سه تا ویدجت با مقادیر ۱ و ۲ و ۳ برای پارامتر دوم داشته باشید.فضای نسبت داده شده به سومی سه برابر اولی و فضای نسبت داده شده به دومی دو برابر اولی خواهد بود.
پیغام های ثابت :
برای پیام های ثابت تابع addPermanentWidget استفاده میشود.این ویدجت ها در سمت راست به status bar اضافه میشند. تضمین شده که این پیام ها هیچ وقت وقفه ای در نمایششون پدید نیاد.
خوب فرض کنید ما میخوایم به متن ثابت به status bar مون اضافه کنیم که تعداد کلمات و تعداد حروف متن داخل جعبه متنمون رو نمایش بده.برای این کار یه اشاره گر به کلاس QLabel عضو کلاس تعریف میکنم و بعد در سازنده یه شی به اون نسبت میدم و بعدش اونو به status bar خودم اضافه میکنم. در اینجا ما نیاز به یه اسلات دیگه هم داریم که وظیفه اش این که صبر کنه هروقت متن m_plainTextEdit عوض شد مقدار پیام ثابت مارو به روز کنه. برای اینکار
در فایل .h ابتدا یه اشاره گر به یک لیبل اضافه میکنیم
class QNotePad : public QMainWindow
{
Q_OBJECT
public:
QNotePad(QWidget *parent=0);
~QNotePad();
private:
...
...
...
QLabel *m_charWordMessage;
public slots:
...
...
void updateStatusBar();
};
m_charWordMessage = new QLabel;
statusBar()->addPermanentWidget( m_charWordMessage );
connect( m_plainTextEdit, SIGNAL(textChanged()), SLOT(updateStatusBar()) );
این سه خط در سازنده اضافه شدند . اولی که یه شی از QLabel به m_charWordMessage نسبت میده . دومی اونو به عنوان یه متن ثابت به statusbar اضافه میکنه و سومی سیگنال textChanged از کلاس QTextEdit رو به اسلاتی که ما قراره خودمون تعریفش کنیم یعنی updateStatusBar وصل میکنه . این سیگنال زمانی فرستاده میشه که متن یه TextEdit تغییر کنه.
void QNotePad::updateStatusBar()
{
QString text = m_plainTextEdit->toPlainText();
int chars = text.length();
text = text.simplified();
int words = 0;
words = text.count(" ");
if (!text.isEmpty()) words++;
QString output = tr("Characters: %1, Words: %2").arg(chars).arg(words);
m_charWordMessage->setText(output);
}
اینم اسلات updateStatusBar که قراره هر وقت سیگنال textChanged فریاد زده شد بیاد و متن داخل پیام ثابت status bar رو به روز کنه. در این تابع از برخی از توابع QString استفاده شده که به شرح زیر هستند.
تابع QString::length تعداد کاراکترهای متن رو بر میگردونه
تابع QString::count تعداد کاراکتر های / متنهایی که به عنوان پارامتر براش ارسال شده رو در متن اصلی برمیگردونه که ما در این جا با شمردن تعداد فاصله ها ، تعداد تقریبی کلمات رو بدست میاریم.
تابع simplified که خیلی مهم هست: space های ابتدا و انتهای متن رو حذف میکنه . و spaceهای درون متن رو اگه چند تا پشت سر هم باشند با یکی جایگزین میکنه.منظور از فضای خالیt', '\n', '\v', '\f', '\r', ' ' s هستند.
اسلات save رو هم میشه به این صورت تغییر داد تا بعد از ذخیره فایل پیغام موقتی رو در مدت ۵ ثانیه نمایش بده
void QNotePad::saveDocument()
{
QString fileName =
QFileDialog::getSaveFileName(this, "Open", "", "Text Files (*.txt);;All Files(*.*)" );
QFile file(fileName );
if (!file.open(QFile::WriteOnly | QFile::Text)) {
QMessageBox::warning(this, tr("Application"),
tr("Cannot write file %1:\n%2.")
.arg(fileName)
.arg(file.errorString()));
return;
}
QTextStream out(&file);
out << m_plainTextEdit->toPlainText();
statusBar()->showMessage("File Saved", 5000 );
}
[/LEFT]
پروژه ضمیمه شد
خسته نباشید.