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

آموزش برنامه نویسی Qt – QSignalMapper


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

در این آموزش با کلاس QSignalMapper و در اختیار گرفتن حافظه بصورت پویا برای ایجاد چندین کلید بصورت پویا آشنا خواهیم شد.

پروژه ای که در قسمت قبل نوشتیم را باز کنید و ابتدا دو عضو خصوصی جدید به کلاس اصلی برنامه با نام های زیر اضافه میکنیم:

    QPushButton **m_multiBtn;

    QSignalMapper *m_mapped;

QSignalMapper  هنگامی کاربرد دارد که بخواهیم به یک Slot پارامتر ارسال کنیم حالا این پارامتر می تواند از نوع int  یا QString  یا QWidget  باشد. بدین صورت که ابتدا کلید یا هر شی دیگری که دارد به برنامه سیگنال میفرستد را با استفاده از تابع connect() به شی ایجاد شده از کلاس QSignalMapper  وصل می کنیم. سپس شی کلاس QSignalMapper  را به اسلات مورد نظر وصل میکنیم .به خطوط زیر دقت کنید:

  1. m_multiBtn=new QPushButton*[4];
  2. m_mapped=new QSignalMapper(this);
  3. for(int i=0;i<4;i++)
  4. {
  5.     m_multiBtn[i]=new QPushButton("کلید پویا "+QString::number(i),this);
  6.     connect(m_multiBtn[i],SIGNAL(clicked(bool)),m_mapped,SLOT(map()));
  7.     m_mapped->setMapping(m_multiBtn[i],i);        
  8.     ui->buttons_layout->addWidget(m_multiBtn[i]);
  9. }
  10. 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 باشد و معمولا ما ازمان اعداد بر مبنای دهدهی استفاده میکنیم.”

ایجاد اشیا پویا و استفاده از کلاس QSignalMapper  در Qt
ایجاد اشیا پویا و استفاده از کلاس QSignalMapper در Qt

zxmain.h

  1. #ifndef ZXMAIN_H
  2. #define ZXMAIN_H
  3.  
  4. #include <QMainWindow>
  5. #include <QPushButton>
  6. #include <QSignalMapper>
  7. namespace Ui {
  8. class zxMain;
  9. }
  10.  
  11. class zxMain : public QMainWindow
  12. {
  13.     Q_OBJECT
  14.  
  15. public:
  16.     explicit zxMain(QWidget *parent = 0);    
  17.     ~zxMain();
  18.  
  19. private slots:
  20.     void on_btn_1_clicked();
  21.     void click_any_button();
  22.     void dynamic_btn_click(int id);
  23.  
  24. private:
  25.     Ui::zxMain *ui;
  26.     QPushButton *m_btn;
  27.     QPushButton **m_multiBtn;
  28.     QSignalMapper *m_mapped;
  29. };
  30.  
  31. #endif // ZXMAIN_H

zxmai.cpp

  1. #include "zxmain.h"
  2. #include "ui_zxmain.h"
  3. #include <QMessageBox>
  4.  
  5. zxMain::zxMain(QWidget *parent) :
  6.     QMainWindow(parent),
  7.     ui(new Ui::zxMain)
  8. {
  9.     ui->setupUi(this);
  10.     connect(ui->btn_2,SIGNAL(clicked(bool)),this,SLOT(click_any_button()));
  11.     connect(ui->btn_3,SIGNAL(clicked(bool)),this,SLOT(click_any_button()));
  12.     m_btn=new QPushButton("کلید جدید");
  13.     ui->buttons_layout->addWidget(m_btn);
  14.     connect(m_btn,SIGNAL(clicked(bool)),this,SLOT(click_any_button()));
  15.     m_multiBtn=new QPushButton*[4];
  16.     m_mapped=new QSignalMapper(this);
  17.     for(int i=0;i<4;i++)
  18.     {
  19.         m_multiBtn[i]=new QPushButton("کلید پویا "+QString::number(i),this);
  20.         connect(m_multiBtn[i],SIGNAL(clicked(bool)),m_mapped,SLOT(map()));
  21.         m_mapped->setMapping(m_multiBtn[i],i);
  22.         ui->buttons_layout->addWidget(m_multiBtn[i]);
  23.     }
  24.     connect(m_mapped,SIGNAL(mapped(int)),this,SLOT(dynamic_btn_click(int)));
  25.  
  26. }
  27.  
  28. zxMain::~zxMain()
  29. {
  30.     delete m_mapped;
  31.     for(int i=0;i<4;i++)
  32.         delete m_multiBtn[i];
  33.     delete [] m_multiBtn;
  34.     delete m_btn;
  35.     delete ui;
  36. }
  37.  
  38. void zxMain::on_btn_1_clicked()
  39. {
  40.     QMessageBox::information(this,"mrzx.ir","شما بر روی کلید یک کلیک کردید.");
  41.  
  42. }
  43.  
  44. void zxMain::click_any_button()
  45. {
  46.     QMessageBox::information(this,"mrzx.ir","کلیک شناسایی شد.");
  47. }
  48.  
  49. void zxMain::dynamic_btn_click(int id)
  50. {
  51.     QMessageBox::information(this,"mrzx.ir","شما بر روی کلید پویای شماره "+QString::number(id)+" کلیک کردید.");
  52. }
مطالب مرتبط

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

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