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

سوال

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

سوالی که خیلی نسبت به اون جستجو کردم و نتیجه ی واضحی نگرفتم اینه که چطور میشه به یک کامپوننت موجود در یک فایل دیگه 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 قرار دادم.

  • پسندیدن 1

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


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

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

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

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

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

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

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

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

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

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

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

  • مطالب مشابه

    • توسط علی رشیدی
      با سلام.
      در بخشی از برنامه‌ام نیاز دارم کامپوننتی داشته باشم که بتواند در حین اجرا کامپوننت‌های دیگر را در خود نمایش دهد. برای مثال اگر دکمه A کلیک شد، Test1 نمایش داده شود و اگر B کلیک شد Test2.
      برای واضح شدن سوال به کد زیر نگاه کنید:
      //Test1.qml import QtQuick 2.0 Rectangle { id: root color: "blue" Text { text: "Test 1" } } //Test2.qml import QtQuick 2.0 Rectangle { id: root color: "blue" Text { text: "Test 1" } } //main.qml import QtQuick 2.0 import QtQuick.Controls 2.3 ApplicationWindow { //Container for the component Item { id: container } Button { onClicked: //make container display Test1 } Button { onClicked: //make container display Test2 } } container را چگونه پیاده‌سازی کنم، یا اگر component خاصی هست که اینکار را انجام می‌دهد ممنون می‌شوم راهنمایی کنید.
    • توسط کامبیز اسدزاده
      با سلام،
      طبق بررسی‌های لازم تغییراتی در گروه‌های کاربری اعمال شده است که از این پس کاربرانی که به عنوان کاربران فعال در حوزه‌ی یادگیری و مشارکت در بحث‌ها فعال می‌کنند از گروه پیش‌فرض کاربران عادی به کاربران رسمی تغییر دسترسی خواهند داشت.
      طبق آخرین اصلاحیه در سند‌( شرایط کسب مجوز فعالیتی و ارتقا حساب‌کاربری) ، کاربران عضو در این گروه دسترسی لازم برای ارسال تصویر، افزودن امضاء و همچنین عدم نیاز به تایید مطالب توسط مدیریت را خواهند داشت.
    • توسط miladrahbari
      سلام،
      من در پروژه‌ی خودم از یک ویجت استفاده می‌کنم که داخل آن ویجت یک کلاس mainwindow وجود دارد. در داخل این کلاس من دو تا qquickwidget تعریف کردم تا از المان های درست شده در qml استفاده کنم.
      حالا سوالی که مطرح می‌شود این است. فکر کنید من در داخل یک ویجت ۱۰ بار از این component که در qml وجود دارد استفاده کردم. حالا مثلا مقدار یک component کیو ام ال رو تغییر می‌دهم و شکل ظاهری این المان تغییر می‌کند. وقتی که شکل این المان تغییر می‌کند کل صفحه (ویجت) repaint می‌شود؟؟؟ یا فقط اون المان خاص؟؟؟
      ممنون
    • توسط کامبیز اسدزاده
      همانطور که می‌دانید محیط توسعه‌ی یکپارچه‌ی نرم‌افزار Visual Studio به عنوان یکی از جامع‌ترین محیط‌های توسعه بسیار شناخته شده است. برنامه‌نویسان سی‌پلاس‌پلاس بسیاری از پروژه‌های خود را تحت این محیط علاوه بر آن کیوت کریتور توسعه می‌دهند. کتابخانه‌ی کیوت افزونه‌ای را برای یکپارچه سازی خود با محیط ویژوال استودیو ارائه داده است که در حالت عادی از کتابخانه‌ی Qt به خوبی پشتیبانی می‌کند و اجازه می‌دهد تا شما کُد‌های خود را که بر اساس کتابخانه‌ی کیوت هستند در محیط ویژوال استودیو توسعه و خروجی بگیرید.
      اما محدودیت‌هایی در این افزونه تا به امروز وجود دارد، یکی از آن‌ها عدم هماهنگی و پشتیبانی از زبان QML بر پایه جاوا اسکریپت است. در نسخه‌ی بعدی کیوت یعنی 5.12.0 افزونه‌ی Qt Visual Studio Tools, v2.3.0 نیز منتشر خواهد شد که با نسخه‌های جدید ویژوال استودیو هماهنگ و به شما امکان اینم را خواهد داد تا بتوانید کد‌های نوشته شده توسط QML و JavaScript را اشکال‌زدایی کنید.
      این امکان وجود خواهد داشت تا شما هر جایی که نقطه‌ی توقف برای اشکال زدایی ایجاد کرده اید را مورد تجزیه تحلیل قرار خواهید داد. از جمله، تغییر تحولات در ارزش‌های متغیر‌ها و دیگر موارد.

      نسخه‌ی جدید این افزونه به طور کامل با زیرساخت اشکال زدایی QML یکپارچه سازی شده است. که به عنوان بخشی از ماژول Qt QML خدماتی برای اشکال زدایی، بررسی و ثبت و ظبط برنامه را از طریق یک پور TCP فراهم می‌کند.




      به صورت پیش‌فرض ویژگی اشکال زدایی در QML برای ویژوال استودیو فعال است. شما می‌توانید آن را در بخش تنظیمات افزونه ویژوال استودیو برای Qt غیرفعال کنید.

      این ابزار را می‌توانید از این بخش دریافت کنید.
×