آموزش برنامه نویسی Qt – QSignalMapper
در این آموزش با کلاس QSignalMapper و در اختیار گرفتن حافظه بصورت پویا برای ایجاد چندین کلید بصورت پویا آشنا خواهیم شد.
پروژه ای که در قسمت قبل نوشتیم را باز کنید و ابتدا دو عضو خصوصی جدید به کلاس اصلی برنامه با نام های زیر اضافه میکنیم:
QPushButton **m_multiBtn;
QSignalMapper *m_mapped;
QSignalMapper هنگامی کاربرد دارد که بخواهیم به یک Slot پارامتر ارسال کنیم حالا این پارامتر می تواند از نوع int یا QString یا QWidget باشد. بدین صورت که ابتدا کلید یا هر شی دیگری که دارد به برنامه سیگنال میفرستد را با استفاده از تابع connect() به شی ایجاد شده از کلاس QSignalMapper وصل می کنیم. سپس شی کلاس QSignalMapper را به اسلات مورد نظر وصل میکنیم .به خطوط زیر دقت کنید:
m_multiBtn=new QPushButton*[4];
m_mapped=new QSignalMapper(this);
for(int i=0;i<4;i++)
{
m_multiBtn[i]=new QPushButton("کلید پویا "+QString::number(i),this);
connect(m_multiBtn[i],SIGNAL(clicked(bool)),m_mapped,SLOT(map()));
m_mapped->setMapping(m_multiBtn[i],i);
ui->buttons_layout->addWidget(m_multiBtn[i]);
}
connect(m_mapped,SIGNAL(mapped(int)),this,SLOT(dynamic_btn_click(int)));
در اینجا ابتدا 4 کلید از نوع QPushButton*ایجاد کردیم سپس کلید ها را تعریف و هر کدام را در حلفه for به اسلات map() از شی m_mapped از کلاس QSignalMapper وصل کردیم .در انتها شی m_mapped را به اسلات اصلی مد نظر ما یعنی همان متد dynamic_btn_click(int) وصل کردیم.
دقت نمایید که شی m_mapped با استفاده از متد setMapping() مقدار ارگومانی که هر شی ارسال می کند را در خود ذخیره می نمایید و هنگامی که ما روی آن کلید کلیک میکنیم آن آرگومان را مستقیما به اسلات مقصد (dynamic_btn_click ) ارسال می کند. که در اینجا ان مقدار را همان اعداد صفر تا 3 در نظر گرفتیم. برای مثال مثلا میتوانستیم بنویسم :
m_mapped->setMapping(m_multiBtn[1],55);
یعنی شی m_multiBtn[1] را مقدار آرگومان 55 در signalmapper ذخیره کردیم…
” متد number() از کلاس Qstring یک متد static است که برای تبدیل اعداد به رشته هایی از نوع QString کاربرد دارد. “
QString QString::number(long n, int base = 10);
” که n عدد مورد نظر و base مبنای نمایشی آن عدد است که می تواند بین 2 تا 36 باشد و معمولا ما ازمان اعداد بر مبنای دهدهی استفاده میکنیم.”
zxmain.h
#ifndef ZXMAIN_H
#define ZXMAIN_H
#include <QMainWindow>
#include <QPushButton>
#include <QSignalMapper>
namespace Ui {
class zxMain;
}
class zxMain : public QMainWindow
{
Q_OBJECT
public:
explicit zxMain(QWidget *parent = 0);
~zxMain();
private slots:
void on_btn_1_clicked();
void click_any_button();
void dynamic_btn_click(int id);
private:
Ui::zxMain *ui;
QPushButton *m_btn;
QPushButton **m_multiBtn;
QSignalMapper *m_mapped;
};
#endif // ZXMAIN_H
zxmai.cpp
#include "zxmain.h"
#include "ui_zxmain.h"
#include <QMessageBox>
zxMain::zxMain(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::zxMain)
{
ui->setupUi(this);
connect(ui->btn_2,SIGNAL(clicked(bool)),this,SLOT(click_any_button()));
connect(ui->btn_3,SIGNAL(clicked(bool)),this,SLOT(click_any_button()));
m_btn=new QPushButton("کلید جدید");
ui->buttons_layout->addWidget(m_btn);
connect(m_btn,SIGNAL(clicked(bool)),this,SLOT(click_any_button()));
m_multiBtn=new QPushButton*[4];
m_mapped=new QSignalMapper(this);
for(int i=0;i<4;i++)
{
m_multiBtn[i]=new QPushButton("کلید پویا "+QString::number(i),this);
connect(m_multiBtn[i],SIGNAL(clicked(bool)),m_mapped,SLOT(map()));
m_mapped->setMapping(m_multiBtn[i],i);
ui->buttons_layout->addWidget(m_multiBtn[i]);
}
connect(m_mapped,SIGNAL(mapped(int)),this,SLOT(dynamic_btn_click(int)));
}
zxMain::~zxMain()
{
delete m_mapped;
for(int i=0;i<4;i++)
delete m_multiBtn[i];
delete [] m_multiBtn;
delete m_btn;
delete ui;
}
void zxMain::on_btn_1_clicked()
{
QMessageBox::information(this,"mrzx.ir","شما بر روی کلید یک کلیک کردید.");
}
void zxMain::click_any_button()
{
QMessageBox::information(this,"mrzx.ir","کلیک شناسایی شد.");
}
void zxMain::dynamic_btn_click(int id)
{
QMessageBox::information(this,"mrzx.ir","شما بر روی کلید پویای شماره "+QString::number(id)+" کلیک کردید.");
}
دیدگاهتان را بنویسید