622 سوال

629 پاسخ

855 نظر

242 کاربر

به سامانه پرسش و پاسخ کیوت خوش آمدید, این سامانه به شما امکان می دهد پرسشهای خود را طرح نموده و در کوتاهترین زمان ، پاسخ خود را دریافت نمایید.

-قبل از سوال پرسیدن حتما جست و جو کنید.

-در صورتی که سوالی به شما کمک کرد و یا جوابی ، حتما به آن امتیاز مثبت دهید.

-در صورتی که سوالی پرسیدید و جواب خود را گرفتید حتما جواب را به عنوان بهترین جواب انتخاب کنید.

-از ارسال چند سوال در یک تاپیک جدا خودداری کنید.

-نام مناسب برای سوالات انتخاب کنید.

-برچسب مناسب برای سوالات انتخاب کنید.

-برای نوشتن کد کافی است کد را از ادیتور خود کپی و در ادیتور سایت الصاق کنید و با انتخاب کد کلید CTRL+K را فشار دهید.

-حتما قوانین و نکات دیگر را از اینجا بخوانید.

ارتباط بین دو فرم به روش مستقیم و بدون نیاز به سیگنال و اسلات غیر مستقیم...

0 امتیاز
150 بازدید

سلام
چندی پیش سوالی رو مطرح کرده بودن به آدرس مد نظر
حالا می خوام سوالمو یه کم عوض کنم...راههایی هست که شما بتونی با انتشار سیگنال و شنیدنشون تو main و ارتباط بین دو فرم به وسیله main ،این دو فرم رو به هم وصل کنید.
برای مثال فرض کنید قراره تو فرم شماره 1 ،یه دکمه رو کلیک کنید و در فرم شماره 2 یه اتفاقاتی بیفته.خوب شاید راه مستقیم تر هم باشه...
ما تو فلش و خیلی فریم ورک های دیگه می یاییم و یه متغیر از نوع static تو یه کلاس خاص تعریف می کنیم که به وسیله اسم اون کلاس و اون شی استاتیک ،می تونیم به مقادیر یکتا دست پیدا کنیم برای مثال یه فرم رو تو شیی از نوع مناسبش مثل نوع * که نماد هر چی هست یا شی از نوع Object البته استاتیک می ریزیم و از هر جا می تونیم با کمک اون مقدار استاتیک ،به اون شی مثلا فرم دست پیدا کنیم.این باعث می شه که اون کلاس استاتیک مثل یه سرور عمل کنه و هر کسی بتونه به منابع مشترکش دست پیدا کنه و یا با بقیه در ارتباط باشه.مسلما در کیوت به جهت امکانات اشاره گری بهتر می شه این روش رو پیاده کرد منتها وقتی اجرا می کنم و مثلا فرم اول رو به اون می ریزیم ،خطا می ده.طریقه شو کسی میتونه توضیح بده .البته کلاس ها و فرم هایی که تعریف کردیم ،تو تابع main به حالت یه اشاره گر نمونه سازی شدند؟

#ifndef GLOBALS_H
#define GLOBALS_H

#include <QWidget>

class Globals : public QWidget
{
    Q_OBJECT
public:
    explicit Globals(QWidget *parent = 0);
    static QWidget  *MainWidget;

signals:

public slots:

};

#endif // GLOBALS_H

بعد تو کلاس که می خواهیم اونو تو این

 بریزیم :

#include "globals.h"
Globals::MainWidget=this;

و در حین دسترسی از یک کلاس دیگه :

Globals::MainWidget.xyz...

مرسی...

سوال شده تیر 28, 1392  بوسیله ی hadiabbasi کیومن (18,890 امتیاز)  
88% درصد پذیرش جواب ها

1 پاسخ

+1 دیدگاه
 
بهترین پاسخ

ببین هادی جان بهترین روشی که میشه گفت همون قبلیه هست. یعنی شما یه فرم داری به این صورت :

#ifndef FORM1_H
#define FORM1_H

#include <QWidget>

class Form1 : public QWidget
{
    Q_OBJECT
public:
    explicit Form1(QWidget *parent = 0);

signals:
    void someOneClicked();
public slots:

};

#endif // FORM1_H

و با تعریف به صورت زیر :

#include "form1.h"
#include <QPushButton>
Form1::Form1(QWidget *parent) :
    QWidget(parent)
{
    QPushButton *btn = new QPushButton(this);
    btn->setText("do Something !");
    connect(btn, SIGNAL(clicked()), SIGNAL(someOneClicked()));
}

و فرم دیگری داری به نام Form2 به صورت زیر :

#ifndef FORM2_H
#define FORM2_H

#include <QWidget>
#include <QLabel>
class Form2 : public QWidget
{
    Q_OBJECT
    QLabel *lbl;
public:
    explicit Form2(QWidget *parent = 0);

signals:

public slots:
    void doSomething();

};

#endif // FORM2_H

و با تعریف :

#include "form2.h"
#include <QLabel>
Form2::Form2(QWidget *parent) :
    QWidget(parent)
{
    lbl = new QLabel(this);
}

void Form2::doSomething()
{
    lbl->setText("some one clicked !");
}

و توی Main (یا هر جای دیگه ای که بخوای ) به صورت زیر ازشون استفاده میکنی :

#include <QApplication>
#include "form1.h"
#include "form2.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Form1 frm1;
    Form2 frm2;
    QObject::connect(&frm1, SIGNAL(someOneClicked()),
                     &frm2, SLOT(doSomething()));

    frm1.show();
    frm2.show();
    return a.exec();
}

چند تا نکته رو دقت کن:
1- اینکه میشه یه سیگنال از یک شی رو به یک سیگنال از شی دیگه وصل کرد کاری که من با فرم اول کردم و امیت شدن سیگنال دکمه رو فرم باعث امیت شدن سیگنال خود فرم میشه.
2-شاید جایی باشی که نیاز به new کردن Form1 , Form2 باشه دقت کن !
این بهترین کاریه که میشه برای ارتباط بین دوتا فرم انجام داد.

پاسخ داده شده تیر 29, 1392 بوسیله ی admin کیومن (23,310 امتیاز)  
انتخاب شده تیر 29, 1392 بوسیله ی hadiabbasi
سعید جان
من شاید بخوام از یه جای دیگه ای غیر از مین به اون یکی دست پیدا کنم...خوب تو این شرایط چه رفرنس یا چیز دیگه ای هست که به اون یکی دست پیدا کنم؟؟؟
مگر اینکه بگیم باید ارتباطات فرم های مختلف رو باید تو مین بست.خوب یه جورایی منطقی هست ولی وقتی می شه به یه متغیر استاتیک که به طبع می تونه اشاره گر باشه دست پیدا کرد و اشیای ارتباطی رو به اون منتقل کرد تا اشیای دیگه به اون اشاره کنند به نظر شما این راه نمی تونه مستقیم تر باشه به خصوص که تو فلش و انجین یونیتی و خیلی جاهای دیگه با این روش ارتباط برقرار می کنند که به نوبه خودش مستقیم و دم دستیه...
ببین هادی جان هر جایی هم که این دوتا فرم رو ایجاد کنی بازم میتونی به هم کانکتشون کنی. فرض کن اول فرم یک رو میسازی بعد از داخل فرم یک فرم دو رو میسازی. میشه کانکتشون کرد.
فرض کن یه MainWindow داری که فرم یک رو داخل اون میسازی و فرم دو رو هم داخل MainWindow میسازی بازم میشه اینا رو به هم وصل کرد. پس لزوما نباید از داخل مین به هم وصل شن. هر جایی که ساخته میشن این امکان هست.
اصلا شما یه مورد بگو که نمیتونی این دوتا رو به هم کانکت کنی تا من برات توضیح بدم.
مرسی عزیز دل انگیز...
حتما با سیگنال و اسلات و به روشی که گفتید می شه ...منظورم این بود که خوب بالاخره تو برنامه های تحت Qt (مثل همه زمینه های دیگه OOP )به جهت سلسله مراتب درختی اشیای برنامه ،می شه بوسیله سیگنال و اسلات ها ،نهایتا در جایی ،دو شی رو به هم مربوط کرد.منتها مهم دسترسی اون دو شی به هم هست که باید با ارسال سیگنال به خارج و دسترسی به اون سیگنال از بیرون و وصل کردنش به اسلات البته در جایی که هر دو بوجود اومدن ،دو شی رو به هم وصل کرد.(این اوکی)
ولی این حالت رو هم در نظر بگیرید که یه شی رو تو یه اشاره گر static تو یه کلاس بریزید تا بوسیله اشیای دیگه مستقیما و فقط با نوشتن اسم کلاسی که نقش سراسری رو بازی می کنه و اون متغیر استاتیک ،به اون شی دست پیدا کنید.خوب این راه هم سریعتره و هم مستقیم تر...چون تا بخواهید یه سیگنال و اسلات تعریف کنید و پیش برید شاید یه کم سخت باشه از فرم 1 من که تو فرم 2 هست و فرم دو که تو فرم 3 ،بخوام دست پیدا کنم به فرم 4 که بغل فرم 3 هست...
...