معرفی فریمورک اپلیکیشن نویسی Qt ‏(14)

در اینجا میخوایم برای اینکه مطالب مقدماتی کیوت کامل باشن کمی هم درمورد استفاده از رابط های کاربری ای که بصورت ویژوال طراحی شدن صحبت کنیم. این رابطها با نرم افزار Qt Creator ایجاد میشن. البته در نسخه های قدیمی تر کیوت برنامهء جامع Qt Creator وجود نداشت و بجاش فقط برنامهء Qt Designer رو داشتیم. بهرحال در عمل برای کاربرد ایجاد رابطهای کاربری گرافیکی این دوتا فرقی نمیکنن. Qt Creator برنامهء جامعتری برای ایجاد برنامه های دسکتاپ هست که Qt Designer قدیم رو هم درواقع در داخل خودش مجتمع کرده و Qt Designer دیگه یک برنامهء مجزا که بطور مستقل در دسترس باشه نیست.

طرز استفادهء کامل از Qt Creator و طراحی ویژوال رابط گرافیکی توسط اون رو خودتون باید یاد بگیرید و این تاپیک همونطور که از ابتدا گفتم، به این مسائل نمیپردازه. اما من یک مثال کوچک از بکارگیری رابطهای طراحی شده به روش ویژوال رو در اینجا نشون میدم.

Qt Creator رو اجرا کنید.
از منوی File گزینهء New رو انتخاب کنید.
Qt Designer Form رو انتخاب کنید.
Widget رو انتخاب کنید.
یک دایرکتوری برای ذخیره ایجاد/انتخاب کنید.
طراحی ویژوال: یک دکمه روی فرم (صفحهء رابطی که میخواید طراحی کنید) خودتون قرار بدید.
نام این دکمه رو pb بذارید (مقدار فیلد objectName).
خب حالا کار طراحی فرم ما تموم شده و میتونید فرم خودتون رو سیو کرده و برنامهء Qt Creator رو ببندید.

چون من در اینجا میخوام فقط طرز استفاده از فرمهای تولید شده رو در سورس برنامه ها نشون بدم، بقیهء کارها رو به روش خیلی پایه ای استفاده از خط فرمان کیوت انجام میدم، وگرنه میشه بقیهء فایلهای برنامه رو هم با استفاده از Qt Creator ایجاد و در همون محیط کدنویسی کرد و مراحل کامپایل رو هم از طریق Qt Creator براحتی انجام داد (البته خودم هنوز تست نکردم!!).

ضمنا توجه داشته باشید روشی که مطرح میشه یکی از چند روش استفاده از فایلهای تولید شده توسط محیط ویژوال کیوت هست که من این روش رو بخاطر مناسبتر و عمومی تر بنظر اومدن از بین بقیه انتخاب کردم.

الان ما باید یک فایل با پسوند ui در دایرکتوری ای که Qt Creator انتخاب کرد یا ما براش انتخاب کردیم داشته باشیم. این فایل محتوی شرح رابط کاربری طراحی شده توسط شما، در فرمت XML هست. این فایلهای ui یا موقع ساخت برنامه به فایل و کدهای سی++ متناظر ترجمه و بعد کامپایل میشن و یا میتونن موقع اجرای برنامه بطور دینامیک لود و اجرا بشن. ما در اینجا به حالت اول، یعنی تبدیل و کامپایل اولیه میپردازیم چون بنظرم عمومی تر و بهینه تر هست.

فایل من اسمش form.ui هست که در دایرکتوری ای با نام test روی دسکتاپم ذخیره شده.
وقتی من اقدام به ساخت برنامه بکنم یک فایل به نام ui_form.h از روی این فایل ایجاد خواهد شد که محتوی یک کلاس با نام Form خواهد بود که این کلاس کدهای سی++ معادل رابط گرافیکی ای رو که بصورت ویژوال طراحی کردیم در خودش داره.

حالا من یک فایل با نام myui.h در دایرکتوری برنامه ایجاد میکنم که محتویاتش اینهاست:

#include <QWidget>
#include "ui_form.h"

class myUi : public QWidget, private Ui::Form
{
Q_OBJECT

public:
myUi(QWidget *parent = 0) : QWidget(parent)
{
setupUi(this);
}

private slots:
void on_pb_clicked() {
qApp->quit();
}
};

در خط یک و دو اینکلودهای لازم رو انجام دادیم.
ما نیاز داریم یک کلاس درست کنیم (اسم این کلاس رو myUi گذاشتم) که ترکیبی از QWidget یا (هر کلاس رابط گرافیکی دیگری که میخوایم) باشه که فرم ما نیاز داره اون رو بعنوان Parent خودش داشته باشه و بعد بتونیم اجزای دیگری رو هم که میخوایم، بدون نیاز به دستکاری فایل فرم مورد نظر به کلاس خودمون اضافه کنیم؛ بنابراین ما کلاسی میسازیم (خط 4) که ترکیبی از هردوی QWidget و کلاس تعریف شده در ui_form.h باشه.
private در private Ui::Form میگه که اجزای کلاس رابط گرافیکی طراحی شده باید فقط از داخل این کلاس ترکیبی در دسترس باشن (این یک طراحی استاندارد و اصولی بحساب میاد).
فضای نامی Ui هم در ui_form.h تعریف شده؛ بهتره به محتویات ui_form.h خوب نگاه کنید (این فایل موقع اجرای فرمان mingw32-make release تولید میشه). چیز حجیم و پیچیده ای داخلش نیست که قابل درک یا نوشتن توسط خودمون نباشه!
حتما یادتون هست که در تعریف کلاسهایی که در اونها سیگنال و اسلات (Signals and Slots) ایجاد میکنیم به ماکروی Q_OBJECT نیاز داریم. ضمنا یک نکتهء ریز قابل ذکر اینه که فایلی که این ماکرو درش هست باید پسوند h داشته باشه (قبلا در این تاپیک گفتم چرا).
در constructor ما setupUi رو که عضو کلاس تعریف شده در ui_form.h هست فراخوانی میکنیم و کلاس جاری رو که یک شیء رابط کاربری گرافیکی هست (باید از QWidget ارث بری داشته باشه) بعنوان Parent بهش پاس میکنیم.
کار setupUi اینه که اجزای رابط گرافیکی ما رو در کلاس Ui::Form ایجاد میکنه؛ بعد از این مرحله ما به این اجزاء (مثلا دکمهء خودمون) از داخل کلاس خودمون هم دسترسی مستقیم داریم. مثلا میتونیم این کد رو بکار ببریم:

pb->setText("Quit app!");

البته این یه مثال بود و بدیهی هست که برچسب روی دکمه رو میتونستیم در همون Qt Creator براحتی تعیین کنیم.
در خط 16 ما اسلاتی رو تعریف کردیم و الگوی خاص نامگذاری این اسلات (به کلمات اضافه شده در سمت چپ و راست pb توجه کنید) باعث میشه که سیگنال clicked دکمه ای که ما قبلا طراحی کرده بودیم و اسمش رو pb گذاشته بودیم بطور خودکار به این اسلات متصل بشه.
ضمنا کار این اسلات اینه که خیلی ساده باعث خروج از برنامه میشه و بنابراین با کلیک بر روی دکمه، باید برنامه خاتمه پیدا کنه و اینطوری میفهمیم که کار اتصال خودکار سیگنال و اسلات در برنامهء ما واقعا انجام شده.

خب نهایتا ما یک فایل main.cpp هم داریم:

#include <QApplication>
#include "myui.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

myUi ui;
ui.show();

return app.exec();
}

در این فایل که حاوی تابع اصلی و نقطهء شروع و اجرای برنامهء ماست، ما بسادگی یک نمونه از کلاس ترکیبی خودمون رو ایجاد کرده و نمایش دادیم.

حالا فایل اجرایی برنامه رو در خط فرمان کیوت ساخته و اجرا میکنیم.
برای اینکار، خط فرمان کیوت رو اجرا کرده و prompt (اعلان خط فرمان) رو به دایرکتوری test میبریم و بعد فرمانهای زیر رو به ترتیب اجرا میکنیم:

qmake -project
qmake
mingw32-make release
release\test.exe

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>