آموزش برنامه نویسی Qt – رویداد بسته شدن پنجره
در این آموزش به رویداد بسته شدن پنجره ( QCloseEvent ) می پردازیم که در هنگامی که کاربر بر روی close کلیک می کند متد خاصی را قبل از بسته شدن پنجره اجرا کنیم.
یک پروژه جدید به نام zxEvents بسازید و نام کلاس اصلی آن را zxMain بگذارید و بیس کلاس این برنامه را QMainWindow بگذارید.
و حداقل نسخه قابل اجرای برنامه را Qt 5 بگذارید؛ مانند تصویر زیر (سایر جزیئات را وارد کنید) :
به فرم طراحی بروید و فرم زیر را طراحی کنید:
نام کلید خروج را btn_close بگذارید و استایل شیت زیر را به فرم طراحی اضافه کنید:
QWidget#centralWidget{background:white;}
QPushButton{
background:#03dac6;
color:white;
font-size:14pt;
border:0px;
border-radius:10px;
min-height:20px;
min-width:30px;
padding:5px;
}
QPushButton:hover{
background:#41cd52;
}
QLineEdit{
border:1px solid gray;
border-radius:8px;
font-size:14px;
}
QLineEdit:focus{
border:1px solid #03dac6;
}
هدف:
می خواهیم در این برنامه با کلیک بر روی کلید خروج یا علامت ضربدر خود پنجره از کاربر یک سوال پرسیده که میخواخد برنامه را ببند؟ و در صورتی که بر روی کلید yse کلیک کرد پنجره بسته شود.
کلاس های مورد نیاز:
در این پروژه به کلاس های QMessageBox و QCloseEvent نیاز داریم. پس این دو کلاس را به برنامه اضافه کنید(include) .
راه حل :
برای بسته شدن پنجره ما میتوانیم رویداد (event) بسته شدن پنجره را که در کلاس Qwidget وجود دارد مجددا پیاده سازی بکنیم؛ نام این متد closeEvent( QCloseEvent *e ) می باشد ، و کار این متد این است که هنگامی که کاربر در خواست بسته شدن پنجره را بدهد این متد اجرا میشود که آرگومانی از جنس QCloseEvent ارسال میکند و از طریق این شی (e) میتواند آن را بپذیرد یا خیر..
پیاده سازی :
ابتدا وارد کلاس zxMain شوید و این متد را معرفی میکنیم:
protected:
void closeEvent(QCloseEvent *e);
و در فایل zxmain.cpp آن را پیاده سازی می کنیم:
void zxMain::closeEvent(QCloseEvent *e)
{
QMessageBox::StandardButton answer=QMessageBox::question(this,
"هشدار",
"آیا می خواهید پنجره را ببندید؟",
QMessageBox::Yes|QMessageBox::No);
if(answer==QMessageBox::Yes)
e->accept();
else
e->ignore();
}
تا اینجا هنگامی که کاربر بروی کلید بستن پنجره ویندوز کلیک کند این رویداد اجرا می شود و برای کلیذ ui->btn_close کافی است این کلید را به متد close() از کلاس QWidget وصل کنیم برای این منظور کافی است در کانستراکتور کلاس این عملیات را پیاده سازی کنیم:
connect(ui->btn_close,SIGNAL(clicked(bool)),this,SLOT(close()));
حال برنامه را اجرا کنید می بینید که با کلیک بر روی ضربد یا خروج این پیغام نمایش داده می شود و در صورتی که yes انتخاب شود برنامه بسته می شود.
پیاده سازی متد 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#ifndef ZXMAIN_H
#define ZXMAIN_H
#include <QMainWindow>
namespace Ui {
class zxMain;
}
class zxMain : public QMainWindow
{
Q_OBJECT
public:
explicit zxMain(QWidget *parent = 0);
~zxMain();
private:
Ui::zxMain *ui;
protected:
void closeEvent(QCloseEvent *e);
};
#endif // ZXMAIN_H
#include "zxmain.h"
#include "ui_zxmain.h"
#include <QMessageBox>
#include <QCloseEvent>
zxMain::zxMain(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::zxMain)
{
ui->setupUi(this);
connect(ui->btn_close,SIGNAL(clicked(bool)),this,SLOT(close()));
}
zxMain::~zxMain()
{
delete ui;
}
void zxMain::closeEvent(QCloseEvent *e)
{
QMessageBox::StandardButton answer=QMessageBox::question(this,
"هشدار",
"آیا می خواهید پنجره را ببندید؟",
QMessageBox::Yes|QMessageBox::No);
if(answer==QMessageBox::Yes)
e->accept();
else
e->ignore();
}
دیدگاهتان را بنویسید