وراثت



  • p{direction:rtl; text-align:right}. سلام

    p{direction:rtl; text-align:right}. من میخوام قسمت option برنامه ام رو توی یه کلاس جدید بذارم
    برای این کار اول یه کلاس به اسم option از کلاس اصلی برنامه به ارث میبرم و بعد connect برای این کلاس جدید کار نمیکنه
    چی کار باید بکنم؟

    p{direction:rtl; text-align:right}. اگه میشه یه نمونه کد ساده برای ارتیاط فرم ها با هم بهم بدین
    ممنون



  • p{direction: rtl; text-align:right}. بدون دیدن کد نمیتونیم راهنماییت کنیم



  • p{direction:rtl; text-align:right}. کدش دربه داغونه :)
    https://github.com/silvergit/tictactoe
    من تازه دارم qt رو یاد میگیرم
    البته اگه یه مثال ساده با دو فرم برای ارتباط بین فرم ها میزدین بیشتر بهم کمک میشد
    شما کلاً از چه روشی استفاده میکنین؟
    وراثت - کلاس دوست - سیگنال و اسلات



  • اگه دقیق بگی چی کار میخوای بکنی بهتر میشه کمک کرد

    استفاده می کنی و میخوای یه فرم یا دیالوگ که توش درست کردی را بهش ربط بدیmainwindowاگه از

    و همون سیگنال و اسلاتهconnect فکرکنم متداول ترین راهش استفاده از تایع
    مثلا یه دکمه بزار وقتی کلیک شد یه تابع فراخونی کنه که توش فرم جدید ساخته شه و ادامه داستان



  • p{direction:rtl; text-align:right}. برای مثال این رو در نظر بگیرید
    من با qdesigner دو تا فرم طراحی میکنم و میخوام فرم دوم با کلیک روی یه دکمه بتونه یه متغیر عضو کلاس فرم اول که private هم هست رو تغییر بده یا برعکس

    p{direction:rtl; text-align:right}. قبلا تمام کدهامو توی یه کلاس مینوشتم و مشکلی نیود اما الان میخوام برای هر فرم یه کلاس مجزا داشته باشم
    البته mainwindow و dialog و widget هم برام فرقی نداره فقط دسترسی به متغیرهای همدیگه برام مهمه



  • من یه برنامه نوشتم که توش تو مین ویندو با کلیک یک فرم جدید می سازه و از کلاس مین ویندو مقدار لیبل موجود در کلاس فرم دومی رو تغییر می ده
    مقدار یک رشته در کلاس فرم رو تغییر میده و میریزه تو لیبل کلاس فرم
    کثیف کد زدم :D
    ببین کمکت میکنه ؟
    mainWindow.h
    @
    namespace Ui {
    class MainWindow;
    }
    class myform;
    class MainWindow : public QMainWindow
    {
    private slots :
    void newForm();
    private:
    myform *myForm;
    };
    @
    mainWindow.h
    @
    #include "myform.h"
    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    ui->setupUi(this);
    myForm = new myform;
    connect(ui->pushButton , SIGNAL(clicked()) , this , SLOT(newForm()));
    }
    void MainWindow::newForm(){
    MainWindow::myForm->str = "This str changed in main window class ";
    QString str2 = MainWindow::myForm->str ;
    MainWindow::myForm->label->setText(str2);
    myForm->show();
    }
    @
    myform.h
    @
    #include "ui_myform.h"
    class myform : public QWidget , public Ui_Form
    {
    public:
    myform( QWidget * parent = 0, Qt::WindowFlags f = 0 );
    QString str ;
    };
    @
    myform.cpp
    @
    myform::myform( QWidget *parent, Qt::WindowFlags f ) :
    QWidget( parent, f )
    {
    setupUi( this );
    str = "nothing";
    }
    @



  • p{direction: rtl; text-align:right}. اگر متغیر ها Private هستن بهتره از Signal و Slot استفاده کنی. در غیر اینصورت میتونی کلاس رو بصورت Pointer در Constructor فرم دیگه ارسال کنی و با include کردن header کلاس به اجزاء public کلاس دسترسی داشته باشی.



  • p{direction:rtl; text-align:right}. محسن جان چطوری میشه با سیگنال و اسلات عضو private یک کلاس رو از طریق یک کلاس دیگه دسترسی پیدا کرد ؟
    یه توضیح مختصر می دی ؟
    ممنون



  • p{direction:rtl; text-align:right}. بطور کلی به هیچ یک از اشیاء private یک کلاس نمیشه دسترسی داشت ولی با پیاده سازی یک slot public میشه به اونها اطلاعات push کرد و یا گرفت. چیزی شبیه به setter و getter ها



  • @Mohsen : TNX



  • p{direction:rtl; text-align:right}. ممنون محسن جان
    مصطفی جان ممنون بابت کدت اما نتونستم کامپایلش کنم میشه کد رو برام آپلود کنی؟

    p{direction:rtl; text-align:right}. توی این خط

    @class myform : public QWidget , public Ui_Form@

    p{direction:rtl; text-align:right}. خطا داشتم که با این جایگزینش کردم
    @class myform : public QWidget , public Ui_myform@

    p{direction:rtl; text-align:right}. این رو هم نفهمیدم
    @myform::myform( QWidget *parent, Qt::WindowFlags f ) :
    QWidget( parent, f )@

    p{direction:rtl; text-align:right}. اون f چیه



  • p{direction:rtl; text-align:right}. علی من کد و تو ویندوز نوشتم
    کلا باید برای این کار اون عضوی که می خوای مثلا member1 که تو کلاس دومی هست باید public باشه تا بتونی از طریق کلاس دیگه بهش دسترسی داشته باشی



  • p{direction:rtl; text-align:right}. ممنون عزیزم
    فقط نگفتی کار اون f و public Ui_Form چیه

    p{direction:rtl; text-align:right}. راستی کسی توی اصفهان هست که بتونه یه کلاس Qt برای ما بذاره



  • p{direction:rtl; text-align:right}.
    https://github.com/bs994/example1
    اینجا سورس اصلی رو اپ کردم
    Public Ui_Form :
    اونو واسه این گذاشته بودم که بتونم از تو کلاس mainWindow به ویجت های کلاس فرمم دسترسی مستقیم داشته باشم
    QT::WindowFlags :
    http://doc.qt.nokia.com/4.7-snapshot/widgets-windowflags.html



  • p{direction:rtl; text-align:right}. ممنون بابت آپلود کد
    مگه اسم کلاست myform نبود پس چرا از Ui_myform استفاده نکردی؟ این همون خطاییه که به من داد



  • p{direction:rtl; text-align:right}. خواهش میکنم
    اون Ui_Form برای این بود که من تو دیزاینر فرمی که طراحی کرده بودم ObjectName ش Form بود به اسم کلاس ربط نداشت
    این کدی هم که آپ کردم همون کد قبلی نیست ولی اون کاری که میخوای و بهتر انجام میده



  • p{direction:rtl; text-align:right}. این کدی که دادی رو یه فرم براش ساختم و اسلات newDialog2() رو بهش اضافه کردم تا کار کرد
    ممنون کارم راه افتاد باید برم ببینم میتونم رو برنامه خودم ازش استفاده کنم یا نه
    لطف کردی :)



  • p{direction:rtl; text-align:right}. خب نصف مشکل حل شد
    فقط یه چیز برای برگشت ارتباط باید چه کرد؟
    مثلا توی برنامه شما اگه بخوام با کلیک روی لیبل توی ویجت یه چیزی توی مین ویندو مثل متن دکمه رو عوض کنم چظور؟
    برای ارتباط دوطرفه راهی پیدا نکردم

    p{direction:rtl; text-align:right}. البته این کارها رو کردم ولی به نتیجه ای نرسیدم
    اول توی MainWindow یه اسلات برای تغییر متن دکمه گذاشتم
    بعد یه سیگنال کلیک برای لیبل توی myForm که همون ویجت دوم باشه تعریف کردم

    p{direction:rtl; text-align:right}. این که کار نمیده
    Mainwindow::changeBtnText();

    p{direction:rtl; text-align:right}. نمیشه هم دوباره توی myForm یه شیء جدید از MainWindow ساخت.



  • p{direction:rtl; text-align:right}. فرقی نمیکنه از هر کلاسی اگه بخوای به یه عضو کلاس دیگه دسترسی داشته باشی باید اون عضو public باشه و این که یک شی باید ازش بسازی
    بدون شی دسترسی هم وجود ندارد



  • p{direction:rtl; text-align:right}. خب من از راه سیگنال و اسلات تونستم یه کارایی بکنم
    باید توی فرم اول یه ارتباط برقرار کنم بین یه سیگنال از فرم دوم و یه اسلات از فرم اول
    این طوری هم متغیرها private میمونن و هم نیازی نیست دوباره توی فرم دوم یه شیء از فرم اول بسازیم

    p{direction:rtl; text-align:right}. اما برنامه خودم نمیدونم چرا زمان اجرا کردن فرم دوم هنگ میکنه و مینویسه یه خطای غیرمنتظره رخ داده
    از توی Debugger هم چیزی نفهمیدم

    p{direction:rtl; text-align:right}. مصطفی جان میشه یه نگاهی بهش بندازی؟
    http://www.mediafire.com/?foc7ybfxrkw08fu



  • p{direction:rtl; text-align:right}.
    برنامه دیدم خطاش Segmention fault ئه
    خط 4 و 5 فایل options.cpp رو به این تغییر بده
    @
    Options::Options(QWidget *parent) :
    QDialog(parent) , ui(new Ui::Options )
    @

    p{direction:rtl; text-align:right}.
    مشکل حل میشه
    در ضمن تو options.h اینا اضافن
    @ QPushButton *okButton;
    QPushButton *cancelButton;
    QGroupBox *gBoxTurn;
    QGroupBox *gBoxMode;
    QRadioButton *cpuRadio;
    QRadioButton *playerRadio;
    QRadioButton *p2pRadio;
    QRadioButton *p2cRadio;
    QVBoxLayout *topLayout;
    QHBoxLayout *downLayout;
    QVBoxLayout *layout;
    QVBoxLayout *modeLayout;
    QVBoxLayout *turnLayout;@



  • p{direction:rtl; text-align:right}. فقط با اجازت چند تا مشکل دیگه داشت
    اگه خواستی بیا یاهو بحث شیرین هوش مصنوعیه



  • p{direction:rtl; text-align:right}. ممنون عزیزم :)
    چطور حواسم به این ui نبود :(
    آره هنوز کامل نیست دارم کاملش می کنم

    p{direction:rtl; text-align:right}. دیر رسیدم باز بحثی شد خبرم کن
    gTalk:hitman2c47
    yahooID:hitman2_c47



  • p{direction:rtl; text-align:right}. درست کار نمیکنه
    اطلاعات از فرم اول به دومی فرستاده میشن ولی برنمیگردن

    p{direction:rtl; text-align:right}. میشه بگین چی کار کنم یا همون کد اولی رو که گذاشتین کاملش کنین



  • p{direction:rtl; text-align:right}. باید عضو هایی که می خوان تغییر کنند public باشند و شی بسازی یا اگه می بینی که زیاد داره از اصول مهندسی نرم افزار خارج میشه
    همه رو تو یک کلاس بنویس یا از وراثت استفاده کن و اعضا رو protected بزار کلاس دومی اونا را ارث ببره
    علی جان یه خورده وقت می بره بخوام کامل کنم سعیمو میکنم تا فردا یه سورس هم بذارم



  • p{direction:rtl; text-align:right}. ممنون
    منظورم همون مثال خودت بود که کوچیکه و زیاد وققتو نمیگیره
    خیلی شرمنده میکنی مصطفی جان
    من توی ارسال از فرم اول به فرم دوم موفق شدم با سیگنال و اسلات این کار رو بکنم ولی برای اینکه دیتای فرم دوم که توی اولی ساخته شده رو برگردونم مشکل دارم
    طرز کار یکیه ولی نمیدونم چرا برای برگشت کار نمیکنه
    اول می خواستم کلاس دوم رو از اولی به ارث ببرم بعد دیدم توی برنامه های بزرگ این کار رو نمیشه کرد یا اگه بشه اتلاف حافظه زیادی داریم
    در مورد public کردن هم کد جالبی از آب در نمیاد

    p{direction:rtl; text-align:right}. انشاءلله لینوکس رو شروع کنی ما توی فروم لینوکس جبران کنیم :)



  • p{direction:rtl; text-align:right}. علی جان مسئله وقت نیست (من نه دانشگاه میرم نه به طور جدی کار می کنم پشت کنکوری ام دعا کنید :D) خوشحال میشم کمکی کرده باشم
    مشکل اینه که لپ تاپم دست کسیه
    ببین با توجه به برنامه ای که من دیدم بهتر کلا کلاس Option رو حذف کنی و بیاریش تو کلاس mainWindow چون اصلا نیازی نیست یه فرم از پیش طراحی شده رو بیاری تو کدات
    تو کلاس mainWindow بیا یه action برای وقتی که از منو ها options کلیلک شد درست کن و تو اون فرم رو بساز اعضاشم همونایی که تو options.h بود گفتم اضافین اونارو بزار و به اعضای mainWindow اضافه کن اون وقت متغیر هایی که جز mainwindow هستند براحتی توسط فرم جدید options که در حین برنامه ساخته شده تغیر داده میشند.
    یعنی کافیه جای کلاس یهQWidget اضافه کنی و اونو نمایش بدی
    هم از نظر TimeComplexity و هم از نظر memoryComplexity نسبت به قبلیا بهتر میشه



  • [quote author="silver" date="1336217963"] انشاءلله لینوکس رو شروع کنی ما توی فروم لینوکس جبران کنیم :)[/quote]

    p{direction:rtl; text-align:right}. داستانش چیه کدوم فروم لینوکس؟ اینجانب از عشــــــــِّاق مخلص لینوکس هست



  • bq. ببین با توجه به برنامه ای که من دیدم بهتر کلا کلاس Option رو حذف کنی و بیاریش تو کلاس mainWindow چون اصلا نیازی نیست یه فرم از پیش طراحی شده رو بیاری تو کدات

    p{direction:rtl; text-align:right}. اولش همین طوری نوشتم
    ولی برای یادگرفتن این موضوع جداش کردم آخه من هر زبان برنامه نویسی جدیدی رو با نوشتن یه TicTacToe شروع می کنم

    bq. داستانش چیه کدوم فروم لینوکس؟ اینجانب از عشــــــــِّاق مخلص لینوکس هست

    p{direction:rtl; text-align:right}. خب پس گل بود به سبزه هم آراسته شد. خیلی مخلصیم :)
    من فدورا کار میکنم. توی فروم فدورا هم با همین اسم silver می‌تونی پیدام کنی.
    چون دیدم توی ویندوز کد میزنی گفتم حتما از لینوکس استفاده نمی‌کنی

    p{direction:rtl; text-align:right}. Bingo
    نوشتمش
    اینم کدش

    form1.h
    @#ifndef FORM1_H
    #define FORM1_H

    #include <QMainWindow>
    #include "form2.h"

    namespace Ui {
    class Form1;
    }

    class Form1 : public QMainWindow
    {
    Q_OBJECT

    public:
    explicit Form1(QWidget *parent = 0);
    ~Form1();

    private slots:
    void on_pushButton1_clicked();
    void addToForm1(QString text);

    signals:
    void sendToForm2(QString text);

    private:
    Ui::Form1 *ui;
    Form2 *f2;
    };

    #endif // FORM1_H
    @

    form1.cpp
    @#include "form1.h"
    #include "ui_form1.h"

    Form1::Form1(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Form1)
    {
    ui->setupUi(this);
    f2=new Form2();
    connect(f2,SIGNAL(sendToForm1(QString)),this,SLOT(addToForm1(QString)));
    connect(this,SIGNAL(sendToForm2(QString)),f2,SLOT(addToForm2(QString)));
    f2->show();

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

    }

    Form1::~Form1()
    {
    delete ui;
    }

    void Form1::on_pushButton1_clicked()
    {
    sendToForm2(ui->lineEdit1->text());
    }

    void Form1::addToForm1(QString text)
    {
    ui->listWidget1->addItem(text);
    }
    @

    form2.h
    @#ifndef FORM2_H
    #define FORM2_H

    #include <QDialog>

    namespace Ui {
    class Form2;
    }

    class Form2 : public QDialog
    {
    Q_OBJECT

    public:
    explicit Form2(QWidget *parent = 0);
    ~Form2();

    signals:
    void sendToForm1(QString text);

    private slots:
    void on_pushButton2_clicked();
    void addToForm2(QString text);

    private:
    Ui::Form2 *ui;
    };

    #endif // FORM2_H
    @

    form2.cpp
    @#include "form2.h"
    #include "ui_form2.h"

    Form2::Form2(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Form2)
    {
    ui->setupUi(this);
    }

    Form2::~Form2()
    {
    delete ui;
    }

    void Form2::on_pushButton2_clicked()
    {
    sendToForm1(ui->lineEdit2->text());
    }

    void Form2::addToForm2(QString text)
    {
    ui->listWidget2->addItem(text);
    }
    @

    p{direction:rtl; text-align:right}. "اینجا":http://www.mediafire.com/?ap1h83p9i33q8nl هم آپلودش کردم

    p{direction:rtl; text-align:right}. مصطفی جان خیلی زحمت کشیدی. ممنون
    محسن جان تو هم همینطور

    p{direction:rtl; text-align:right}. خدا خیرتون بده :)

    p{direction:rtl; text-align:right}. باید روی برنامه خودم تستش کنم. فقط یه سوال : وقتی می خوایم از چند تا کلاس برای فرم های برنامه استفاده کنیم این روش Signal و Slot سالم ترین روشه دیگه؟‌ منظورم قواعد شیء گراییه



  • [quote author="silver" date="1336222569"]
    اولش همین طوری نوشتم ولی برای یادگرفتن این موضوع جداش کردم آخه من هر زبان برنامه نویسی جدیدی رو با نوشتن یه TicTacToe شروع می کنم ممنون قواعد شیء گراییه[/quote]

    p{direction:rtl; text-align:right}. خوب من راه های دیگه های هم به ذهنم رسید واسه اینکار
    1- بیای از تابع دوست کلاس استفاده کنی اون تابع دوست دو تا کلاس باشه و با توجه به شی ای که از هردو می سازی می تونی به Private ها هم دسترسی داشته باشی
    2- کلاس دومی رو کلاس دوست تعریف کنی مثل قبلی تقریبا
    3- سازنده کلاس mainWindow رو overload کنی و وقتی که تو کلاس جدیدت شی از اون میسازی اون فراخونی شه ولی توش فرم جدید نسازی که تو این حالت باید option های بازی به صورت عضو استاتیک کلاس باشند که وقتی تغییر میدیش تو شی اصلی ساخته شده (تو تابع main) هم تغییرات ایجاد شه

    [quote author="silver" date="1336222569"]
    مصطفی جان خیلی زحمت کشیدی. ممنون
    [/quote]

    p{direction:rtl; text-align:right}. خواهش می کنم عزیزم



  • سخت بود :)
    ممنون :)

    ولی این سیگنال و اسلات عجب مکانیزمیه
    آدم خیلی باهاش راحته البته وقتی که بفهمه چی به چیه


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.