رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران

سوال

با سلام و عرض خسته نباشید.

سوالی که خیلی نسبت به اون جستجو کردم و نتیجه ی واضحی نگرفتم اینه که چطور میشه به یک کامپوننت موجود در یک فایل دیگه Qml دسترسی پیدا کرد و property های اون رو خواند یا نوشت.مثلا من میخوام وقتی روی دکمه ی موجود در فرم یک کلیک شد مقدار text از کامپوننت Text در یک فایل دیگه رو بخونم یا تغییر بدم.(ضمنا هر دو فایل Qml هست)

لطفا اساتید بزرگوار هر کاری که لازم هست انجام بدم رو توضیح بدن.تشکر

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

10 پاسخ به این سوال تا کنون داده شده است

پست های پیشنهاد شده

  • 0
در 2 ساعت قبل، amirb گفته است :

با سلام و عرض خسته نباشید.

سوالی که خیلی نسبت به اون جستجو کردم و نتیجه ی واضحی نگرفتم اینه که چطور میشه به یک کامپوننت موجود در یک فایل دیگه Qml دسترسی پیدا کرد و property های اون رو خواند یا نوشت.مثلا من میخوام وقتی روی دکمه ی موجود در فرم یک کلیک شد مقدار text از کامپوننت Text در یک فایل دیگه رو بخونم یا تغییر بدم.(ضمنا هر دو فایل Qml هست)

لطفا اساتید بزرگوار هر کاری که لازم هست انجام بدم رو توضیح بدن.تشکر

از پراپرتی‌های سراسری و همچنین QtObject استفاده کنید، نمونه مثال زیر رو برای این منظور نوشتم که پاسخ سوال شماست.

//MyFirstFile.qml

import QtQuick 2.11
import QtQuick.Controls 2.2

Page {

    property color setColor: "green"
    property string setTitle: "Hi"

    QtObject {
        id: myObjectSetting
        property color color: setColor
        property string title: setTitle
    }

    Loader {
        sourceComponent: myComp
        anchors.centerIn: parent
    }

    Component {
        id: myComp

        Rectangle {

            color: myObjectSetting.color;
            width: 100; height: 100;

            Text {
                anchors.centerIn: parent
                text: myObjectSetting.title
                color: myObjectSetting.color
            }
        }
    }


}


//MySecondFile.qml
import QtQuick 2.11
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.4

ColumnLayout {

   anchors.centerIn: parent

    MyFirstFile {
            id:myItem
            setTitle: "Hi"
            setColor: "red"

   }

    Button {
            text: "Change"

            onClicked: {
                myItem.setColor = "yellow"
                myItem.setTitle = "Bye!"
            }
      }
}

 

  • تشکر شده 1

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0

ببخشید ولی من حتی متوجه نشدم کدوم فایل دیگری رو تغییر میده!

میشه یه توضیحی راجع به شیوه ی کار بفرمایید.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 2 دقیقه قبل، amirb گفته است :

ببخشید ولی من حتی متوجه نشدم کدوم فایل دیگری رو تغییر میده!

میشه یه توضیحی راجع به شیوه ی کار بفرمایید.

سادست که!

محتوای فایل اول هست MyFirstFile.qml و محتوای فایل دوم MySecondFile.qml پایینی هست. فایل اول شما شامل Component ای هستش که می‌خواهید مقادیرش رو تو فایل دیگه‌ای تغییر بدین. فایل دوم که شامل فراخوانی و اعمال تغییرات روی کامپوننت به حساب میاد.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در هم اکنون، amirb گفته است :

همین روشی هست که مثال زدم، فقط از یه فایل js کمک گرفته که تو این مراحل نیازی نیست.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0

ببینید درست متوجه شدم:

شما در فایل اول در زیر مجموعه ی Page دو عدد property تعریف کردید و مقداری رو که بعدا می خوایم تغییر بدیم رو وابسته ی به اونها کردید.بعد توی فایل دوم اون پروپرتی ها رو مقدار جدید دادید.

خب پس نقش qtobject چی هست اینجا؟

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 11 دقیقه قبل، amirb گفته است :

ببینید درست متوجه شدم:

شما در فایل اول در زیر مجموعه ی Page دو عدد property تعریف کردید و مقداری رو که بعدا می خوایم تغییر بدیم رو وابسته ی به اونها کردید.بعد توی فایل دوم اون پروپرتی ها رو مقدار جدید دادید.

خب پس نقش qtobject چی هست اینجا؟

شما می‌تونید اون QtObject رو حذف و مستقیم پراپرتی‌های عمومی تعریف کنید، باز هیچ ایرادی نداره اما در اصل QtObject به عنوان یک عنصر غیر بصری می‌تونه نام اشیاء رو بگیره و اون‌ها رو در جایی که می‌خواین در اختیارتون قرار بده. مثلاً وقتی می‌خواین یک کامپوننت یا ماژول یا هر نوع افزونه‌ای به بخشی از برنامه‌ی خودتون در QML اضافه کنید بهتره از QtObject هم استفاده کنید تا اشیاء مربوط به اون واحد رو به صورت اختصاصی تعریف و سفارشی سازی کنید که در توسعه و حتی برقراری ارتباط با سی‌++ بسیار مفید خواهد بود.

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0

متوجه شدم.تشکر بسیار.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0

با عرض سلام مجدد.

دو سوال در ادامه ی همین بحث داشتم:

1. ما برای این که بتونیم این فراخوانی رو انجام بدیم یک instance از فایل مبدا در فایل مقصد ایجاد می کنیم که برای این کار باید فایل با حرف بزرگ باشه(چون آیتم با حروف بزرگ شروع میشه)درسته؟

خب حالا اگه فایل مبدا ما main.qml بود چطور ازش instance ایجاد کنیم؟من امتحان کردم و فایل رو به Main.qml تغییر نام دادم ولی ارور داد.

 

2. در این روش چون ما instance ایجاد می کنیم پس هر چی توی فایل مبدا هست توی فایل مقصد هم نشون داده میشه.برای حل این مشکل چیکار باید کرد؟

تشکر

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 4 ساعت قبل، amirb گفته است :

با عرض سلام مجدد.

دو سوال در ادامه ی همین بحث داشتم:

1. ما برای این که بتونیم این فراخوانی رو انجام بدیم یک instance از فایل مبدا در فایل مقصد ایجاد می کنیم که برای این کار باید فایل با حرف بزرگ باشه(چون آیتم با حروف بزرگ شروع میشه)درسته؟

خب حالا اگه فایل مبدا ما main.qml بود چطور ازش instance ایجاد کنیم؟من امتحان کردم و فایل رو به Main.qml تغییر نام دادم ولی ارور داد.

 

2. در این روش چون ما instance ایجاد می کنیم پس هر چی توی فایل مبدا هست توی فایل مقصد هم نشون داده میشه.برای حل این مشکل چیکار باید کرد؟

تشکر

در اسناد QML هر فایلی می‌تونه به عضو‌ها و خواص فایل‌های والد خودش دسترسی پیدا کنه. اما روش پیشنهادی این هست با تعریف یک QtObject اعضای مورد نظر خودتون رو تعریف کنید تا هر جا داخل هر فایلی که هستین بتونید به اون دسترسی داشته باشید.

به عنوان مثال فایل main.qml

import QtQuick 2.11
import QtQuick.Window 2.11

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    QtObject {
        id:mainObject

        property string name : "Kambiz"
    }

    Page1 { anchors.fill: parent; }

}

و فایل دیگه که با نامPage1.qml هست تنها کافیه درونش شناسه‌ی QtObject رو صدا بزنید. به صورت زیر:

import QtQuick 2.0

Item {

    Text {
        anchors.centerIn: parent
        text: mainObject.name
    }

}

اینجا من مقدار name که به عنوان عضوی از فایل main.qml هست رو صدا زدم و برابر با مقدار نوع Text قرار دادم.

  • پسندیدن 2

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید دیدگاهی ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری

  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×