خانه برنامه نویسی آموزش برنامه نویسی Qt – رویداد بسته شدن پنجره
آموزش برنامه نویسی Qt – رویداد بسته شدن پنجره

آموزش برنامه نویسی Qt – رویداد بسته شدن پنجره


۱۶ فروردین ۱۳۹۸
رضا احمدی
773 بازدید
دسته بندی : c++ , Qt creator , برنامه نویسی

در این آموزش به رویداد بسته شدن پنجره ( QCloseEvent ) می پردازیم که در هنگامی که کاربر بر روی close کلیک می کند متد خاصی را قبل از بسته شدن پنجره اجرا کنیم.

یک پروژه جدید به نام zxEvents بسازید و نام کلاس اصلی آن را zxMain بگذارید و بیس کلاس این برنامه را QMainWindow بگذارید.

و حداقل نسخه قابل اجرای برنامه را Qt 5 بگذارید؛ مانند تصویر زیر (سایر جزیئات را وارد کنید) :

تنظیمات فایل .pro  در محیط کیوتی
تنظیمات فایل .pro در محیط کیوتی

به فرم طراحی بروید و فرم زیر را طراحی کنید:

طراحی فرم پروژه
طراحی فرم پروژه

نام کلید خروج را btn_close بگذارید و استایل شیت زیر را به فرم طراحی اضافه کنید:

  1. QWidget#centralWidget{background:white;}
  2. QPushButton{
  3. background:#03dac6;
  4. color:white;
  5. font-size:14pt;
  6. border:0px;
  7. border-radius:10px;
  8. min-height:20px;
  9. min-width:30px;
  10. padding:5px;
  11. }
  12.  
  13. QPushButton:hover{
  14. background:#41cd52;
  15. }
  16.  
  17. QLineEdit{
  18. border:1px solid gray;
  19. border-radius:8px;
  20. font-size:14px;
  21. }
  22. QLineEdit:focus{
  23. border:1px solid #03dac6;
  24. }

هدف:

می خواهیم در این برنامه با کلیک بر روی کلید خروج یا علامت ضربدر خود پنجره از کاربر یک سوال پرسیده که میخواخد برنامه را ببند؟ و در صورتی که بر روی کلید yse کلیک کرد پنجره بسته شود.

کلاس های مورد نیاز:

در این پروژه به کلاس های QMessageBox  و  QCloseEvent نیاز داریم. پس این دو کلاس را به برنامه اضافه کنید(include) .

راه حل :

برای بسته شدن پنجره ما میتوانیم رویداد (event) بسته شدن پنجره را که در کلاس Qwidget  وجود دارد مجددا پیاده سازی بکنیم؛ نام این متد closeEvent( QCloseEvent *e ) می باشد ، و کار این متد این است که هنگامی که کاربر در خواست بسته شدن پنجره را بدهد این متد اجرا میشود که آرگومانی از جنس   QCloseEvent ارسال میکند و از طریق این شی (e) میتواند آن را بپذیرد یا خیر..

پیاده سازی :

ابتدا وارد کلاس zxMain  شوید و این متد را معرفی میکنیم:

protected:
void closeEvent(QCloseEvent *e);

و در فایل zxmain.cpp آن را پیاده سازی می کنیم:

  1. void zxMain::closeEvent(QCloseEvent *e)
  2. {
  3.     QMessageBox::StandardButton answer=QMessageBox::question(this,
  4.                                                              "هشدار",
  5.                                                              "آیا می خواهید پنجره را ببندید؟",
  6.                                                              QMessageBox::Yes|QMessageBox::No);
  7.     if(answer==QMessageBox::Yes)
  8.         e->accept();
  9.     else
  10.         e->ignore();
  11. }

تا اینجا هنگامی که کاربر بروی کلید بستن پنجره ویندوز کلیک کند این رویداد اجرا می شود و برای کلیذ ui->btn_close کافی است این کلید را به متد close() از کلاس QWidget وصل کنیم برای این منظور کافی است در کانستراکتور کلاس این عملیات را پیاده سازی کنیم:

connect(ui->btn_close,SIGNAL(clicked(bool)),this,SLOT(close()));

حال برنامه را اجرا کنید می بینید که با کلیک بر روی ضربد یا خروج این پیغام نمایش داده می شود و در صورتی که yes انتخاب شود برنامه بسته می شود.

آموزش برنامه نویسی Qt – رویداد بسته شدن پنجره
آموزش برنامه نویسی Qt – رویداد بسته شدن پنجره

پیاده سازی متد question()  از کلاس QMessageBox به شرح زیر است:

QMessageBox::StandardButton   question(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = …, QMessageBox::StandardButton defaultButton = NoButton);

که در ان شرح آرگومانها به شرح زیر است:

parent : در واقع این ارگومان به ما میگوید که پیغام در چه کلاسی باید اجرا شود.

title : عنوان پنجره ای که کاربر مشاهده میکند.

text  : محتوای پیغامی که کاربر دریافت می کند.

buttons : کلید هایی که کاربر جهت انتخاب دارد نام این کلیدها از enum  است به نام StandardButtons شرح کامل این نامها به شرح زیر است :

Constant Value Description
QMessageBox::Ok 0x00000400 An “OK” button defined with the AcceptRole.
QMessageBox::Open 0x00002000 An “Open” button defined with the AcceptRole.
QMessageBox::Save 0x00000800 A “Save” button defined with the AcceptRole.
QMessageBox::Cancel 0x00400000 A “Cancel” button defined with the RejectRole.
QMessageBox::Close 0x00200000 A “Close” button defined with the RejectRole.
QMessageBox::Discard 0x00800000 A “Discard” or “Don’t Save” button, depending on the platform, defined with the DestructiveRole.
QMessageBox::Apply 0x02000000 An “Apply” button defined with the ApplyRole.
QMessageBox::Reset 0x04000000 A “Reset” button defined with the ResetRole.
QMessageBox::RestoreDefaults 0x08000000 A “Restore Defaults” button defined with the ResetRole.
QMessageBox::Help 0x01000000 A “Help” button defined with the HelpRole.
QMessageBox::SaveAll 0x00001000 A “Save All” button defined with the AcceptRole.
QMessageBox::Yes 0x00004000 A “Yes” button defined with the YesRole.
QMessageBox::YesToAll 0x00008000 A “Yes to All” button defined with the YesRole.
QMessageBox::No 0x00010000 A “No” button defined with the NoRole.
QMessageBox::NoToAll 0x00020000 A “No to All” button defined with the NoRole.
QMessageBox::Abort 0x00040000 An “Abort” button defined with the RejectRole.
QMessageBox::Retry 0x00080000 A “Retry” button defined with the AcceptRole.
QMessageBox::Ignore 0x00100000 An “Ignore” button defined with the AcceptRole.
QMessageBox::NoButton 0x00000000 An invalid button.

https://doc.qt.io/Qt-5/qmessagebox.html

در آموزشها و پروژه های بعدی می بینیم که چگونه متن این کلیدها را تغییر دهیم…

سورس کامل پروژه

zxmain.h
  1. #ifndef ZXMAIN_H
  2. #define ZXMAIN_H
  3.  
  4. #include <QMainWindow>
  5.  
  6. namespace Ui {
  7. class zxMain;
  8. }
  9.  
  10. class zxMain : public QMainWindow
  11. {
  12.     Q_OBJECT
  13.  
  14. public:
  15.     explicit zxMain(QWidget *parent = 0);
  16.     ~zxMain();
  17.  
  18. private:
  19.     Ui::zxMain *ui;
  20.  
  21.  
  22. protected:
  23.     void closeEvent(QCloseEvent *e);
  24. };
  25.  
  26. #endif // ZXMAIN_H
zxmain.cpp
  1. #include "zxmain.h"
  2. #include "ui_zxmain.h"
  3. #include <QMessageBox>
  4. #include <QCloseEvent>
  5.  
  6. zxMain::zxMain(QWidget *parent) :
  7.     QMainWindow(parent),
  8.     ui(new Ui::zxMain)
  9. {
  10.     ui->setupUi(this);
  11.     connect(ui->btn_close,SIGNAL(clicked(bool)),this,SLOT(close()));
  12. }
  13.  
  14. zxMain::~zxMain()
  15. {
  16.     delete ui;
  17. }
  18.  
  19. void zxMain::closeEvent(QCloseEvent *e)
  20. {
  21.     QMessageBox::StandardButton answer=QMessageBox::question(this,
  22.                                                              "هشدار",
  23.                                                              "آیا می خواهید پنجره را ببندید؟",
  24.                                                              QMessageBox::Yes|QMessageBox::No);
  25.     if(answer==QMessageBox::Yes)
  26.         e->accept();
  27.     else
  28.         e->ignore();
  29. }
مطالب مرتبط

 دیدگاهتان را بنویسید   

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