رفتن به مطلب
مرجع رسمی سی‌پلاس‌پلاس ایران

بهنام صباغی

کاربـــر رسمی
  • تعداد ارسال ها

    84
  • تاریخ عضویت

  • روز های برد

    27

تمامی مطالب نوشته شده توسط بهنام صباغی

  1. بهنام صباغی

    خب شما دست به کد بشید هرکجا مشکلی بود بپرسید در خدمتم تا دستان مبارک روی کیبورد نره که اشکال کار در نمیاد. الان پروژه‌ای دارید که مشغولش باشید و بتونید روی اون پیاده کنید تا مشکل رو حل کنیم ؟
  2. بهنام صباغی

    این که درست نیست توی هر حلقه یک mutex درست کردی باید یدونه باشه تا وقتی قفل میکنی دسترسی به منبع رو قبول کنه. ببر بیرون تعریف کن و همون یدونه رو باید lock و unlock کنی. یه نگاهی به مثال خود رفرنس بنداز : std::mutex - cppreference.com موفق باشی.
  3. بهنام صباغی

    با سلام تا جایی که به خاطر میارم مایکروسافت هم دیتابیسش رو کراس کرد. ولی در کل انتخاب خوبی نیست MS SQL Server ولی برای انتخاب دیتابیس کلا توی هر پروژه ای باشه باید اول بررسی کنید و میزان نیاز واقعیتون رو مشخص کنید. مثلا اگر بخواید روی موبایل هم خروجی بدید و تمایلی به تغییر دیتابیس نداشته باشید و فقط یک یا چند کاربر به صورت متوالی از نرم افزار استفاده کنند اس کیو لایت میتونه انتخاب خوبی باشه چون روی موبایل هم جواب میده و برای کار تک کاربره (کاری که هم زمانی نداشته باشه توش ) خوبه ولی ممکنه بخواید فقط روی دسکتاپ خروجی بدید و نیاز باشه که حالت سرور داشت هباشه نرم افزار و از چندین کلاینت بهش دسترسی باشه اونطوری بهتره از Mysql یا mariadb یا ... استفاده کنید. در جایی ممکنه بحث سنگین تر باشه که لازم بشه از NOSQL استفاده کنید که البته با توجه به عنوان پروژه شما بعید میدونم لازم بشه. موفق باشید.
  4. بهنام صباغی

    سلام خب کاری که دارید میکنید یک کار اشتباه و غیر اصولی هست شما دارید به ازای هر فایل یک ترد میسازید که این کار درستی نیست شما باید یه توازنی بین این دو پیدا کنید مثلا ممکنه حالت بهینه برای شما این باشه که هر یک دهم از فایلها رو یک ترد مدیریت کنه میتونید از پارالل فور هم استفاده کنید برای این موضوع که خودش هندل میکنه شما سیستمتون تا یه میزان ترد موازی رو پاسخ میده که بعید میدونم بلاتر از 16 باشه پس سختن تردهای بیشتر هزینه ساخت ترد به ازای هر فایل رو به دوشتون میذاره چون ری نیم کردن فایل کار سنگینی نیست به نظر درست نمیاد. شما حد اکثر اگر سیستم i7 دارید که 4 هسته فیزیکی داره و 8 هسته مجازی و تا 16 ترد موازی رو پشتیبانی میکنه حد اکثر تعداد تردهای بهینه 16 هست. بهتره قبل از این که دست به کاری بزنید درموردش مطالعه کنید پیدا کردن میزان ترد بهینه خودش کلی جریان داره اینی که من گفتم از نظر سخت افزاری هست ولی بحث خود کاری که میخواید انجام بدید هم یک تعداد ترد بهینه داره که ممکنه از این تعداد کمتر باشه یعنی ممکنه شما 16 ترد بسازید طولانی‌تر از حالتی باشه که 4 ترد میسازید.
  5. بهنام صباغی

    سلام این پروژه رو دو سال پیش نوشتم یه نگاه بندازید برای اسکرول میتونید ببینید : GitHub - FONQRI/AndroidBookQmlSimple: This is a simple android book that i developed it by Qt framework and QML language but it's not so Principles. این تیکه کد هم برای اضافه کردن داینامیک هست میتونید توی دلیگیت محتوای متفاوتی رو توی هر صفحه با توجه به ایندکسش لود کنید : import QtQuick 2.9 import QtQuick.Window 2.2 import QtQuick.Controls 2.2 Window { visible: true width: 640 height: 480 title: qsTr("Hello World") id: root SwipeView { id: view anchors.fill: parent currentIndex: 1 height: parent.height - but.height width: parent.width contentItem: ListView { id: list model: 1 delegate: Page { background: Rectangle { color: index % 2 ? "yellow" : "blue" } Label { text: "Page1" anchors.centerIn: parent } } snapMode: ListView.SnapOneItem orientation: ListView.Horizontal } } Button { id: but text: "create" onClicked: { list.model++ indicator.count = list.model indicator.currentIndex = view.currentIndex indicator.update() } anchors.horizontalCenter: parent.horizontalCenter } PageIndicator { id: indicator count: view.count currentIndex: view.currentIndex anchors.bottom: view.bottom anchors.horizontalCenter: parent.horizontalCenter } } موفق باشید.
  6. بهنام صباغی

    -pipe
  7. بهنام صباغی

    سلام بستگی به محیط توسعه و ... داره ولی امکان مالتر ترد کامپایل شدن وجود داره میتونید با فلگ تنظیم کنید با چند ترد برنامه کامپایل بشه.
  8. با سلام اولین چیزی که بعد یاد گرفتن درست درمون برنامه نویسی باید توی خودت تغییر بدی همینه که دیدت فقط درآوردن پول نباشه. البته این به این معنی نیست که پول بده یا نباید بابت کاری که میکنیم پول بگیریم. بلکه فقط نباید کار کنی که پول در بیاری وقتی حرفه‌ای میشی که دیدگاهت تغییر کنه و کار رو برای یک هدف والاتر انجام بدی مثلا یکی کار میکنه در مسیر علم پیش میره و بابت کاری که میکنه پول خوبی هم میگیره . یکی داره یک کار ارزشی میکنه و با قدرت و مطالعه پیش میره و در راه خدا کار میکنه اونم پول خوبی میگیره. ولی یکی هم هست که فقط دنبال پوله و همینقدر کوچیک فکر میکنه و تا اواخر عمرش همش همینطور پیش میره. برای تمام این مواردی که گفتم آدمای واقعی در نظر دارم ولی اسم نمیتونم بیارم.
  9. با سلام من پروژه اولی که دور کاری کردم با پست قرارداد برام ارسال شد. پروژه دوم مدیر پروژه بودم و با کسی که میخواست قرارداد رو به صورت دورکاری بنویسه به صورت حضوری قرارداد بستیم. یعنی نشتیم دور هم یک روز نیازمندی های پروژه رو دقیق مشخص کردیم و مکتوبش کردیم و بعد قرارداد امضا شد. البته بیش از یک روز نیاز هست ولی ما قبلش یک سری صحبت های اولیه کرده بودیم.
  10. تا حدودی هیچ کدوم در واقع کد خوب کدیه که خیلی کامنت نداشته باشه و خیلی توش حلقه فور نبینی البته این نظر حاج خانم کیت گرگوری هست که به گفته خودش از وقتی کد سی پلاس پلاس میزده که اصلا مایکروسافت کامپایلر سی پلاس پلاس نداشته. من دوره سی پلاس پلاس مدرنش رو دیدم تاکید میکرد که هی فرت و فرت کامنت نذارید. عقیدش اینه که اگر کسی داره کد رو میخونه و قراه بفهمه اول این که باید برنامه نویس باشه و این خودش تا مراحلی کار رو پیش میبره دوم این که مدام از فور استفاده نشده و تا جای ممکن از توابع معن‌یدار استفاده بشه مثلا از توابع سرفایل Algorithm خیلی استفاده می‌کرد که تا حد خوبی پوشش میده مسائلی که براشون فور میزنیم رو و نکته دیگه این که میگفت مثلا اگر داری یه کاری میکنی که نیاز به کامنت داره عنوان کارت رو بکن نام تابع و این کار رو توی اون تابع انجام بده البته اینو مطمئن نیستم ایشون گفته باشه ولی در کل توی تمیز نویسی تاکید بر اینه . تا جای ممکن باید کامنت توی کد کم باشه و باز به قول ایشون کد خودش باید گویا باشه و باهات حرف بزنه مثلا برای این مثالی که شما فرستادید میشه خیلی راحت بجای پیاده کردن این تابع از تابع std::sort استفاده کرد بجای این که خودمون پیاده کنیم. میدونم این مثال هست برای کامنت ولی نمیشه روی یه مثال کوچیک توضیح داد و تعمیم داد به برنامه های بزرگ باید کل برنامه دیده بشه . توی کدهای واقعی فقط جایی که خیلی خیلی پیچیده هستند باید یک توضیح کوتاه داده بشه و اگر داره استانداردی پیاده میشه یا علمی پیاده میشه که جدای از برنامه نویسیه مثل شبکه و یا ... بهتره فقط لینک به موضوع داده بشه و اگر جایی پیچیدگی برنامه نویسی داره یه کامنت کافیه براش من خودم به شخصه وقتی یه کد پر کامنت میبینم به همون اندازه ناراحت میشم که یه کد بی کامنت میبینم چون حقیقتا حال ندارم این همه کامنت رو بخونم ترجیه میدم کد رو بخونم تا متوجه موضوع بشم. چون کد کاری هست که داره انجام میشه ولی کامنت چیزیه که برنامه نویس دوست داشته پیاده کنه ?
  11. نام نیاز نیست خیلی طولانی باشه چون اگر اسکوپ بندی و استفاده از فضای نام و کلاس به جای خودش باشه به نظرم نام طولانی نیاز نیست میشه با حد اکثر سه کلمه منظور رو رسوند یا شایدم کمتر اگر از دییازنت پترن استفاده بشه و همه چیز اصولی باشه. ولی در کل نام باید معنی داشته باشه مخفف کردن هم اصلا کار قشنگی نیست مگر برای فرمت اطلاعات که کلا باید مخفف باشند.
  12. سلام اون مقدار بازگشتی تابع به چه معنی هست ؟ این توی هیچ کدوم از مثال ها مشخص نیستو توی گایدلاین سی پلاس پلاس ترجیه بر این گذاشته شده که وقتی داری خروجی میدی نام تایپت مشخص کننده باشه من الان هیچ چیزی به ذهنم نمیرسه وقتی اینو میبینم. برای مثال هم این مورد رو نوشته : class Date { // ... public: Month month() const; // do int month(); // don't // ... میتونید برای خوندن موارد دیگه برای کد نویسی بهتر و اصولی‌تر نگاهی بهش بندازید: C++ Core Guidelines در مورد بالا و پایین گذاشتن اون تایپ‌ها هم نکته ای که هست اینه که بهتره از کد مدل استفاده کنید استایل ها متفاوت هست و هرکدوم یک شکل کار می‌کنند. مثلا یکیشون در نظر میگیره که ول صفحه ای که بشه کد رو بدون اسکرول افقی توش دید باید 80 کاراکتر باشه و بعد اگر طولانی بشه میکشنه خودش مثلا تعریف تابع رو به تعداد خطوط بیشتر.
  13. بهنام صباغی

    من همین الان کدت رو بدون تغییر با openmp تست کردم زمان شگفت انگیز شد : real 0m6.534s user 0m49.599s sys 0m0.255s یعنی حدودا 6 ثانیه و نیم راضی هستی یا بهترش کنم ؟ ^_^ این هم کد که البته تغییری نکرده فقط سه خط ماکرو برای openmp اضافه شده : #include <array> #include <chrono> #include <functional> #include <iostream> #include <random> #include <utility> const unsigned int MAX_LENGTH = 100000; bool Compare(unsigned int FirstVariable, unsigned int SecondVariable) { if (FirstVariable < SecondVariable) return true; return false; } void SortArray(std::array<unsigned int, MAX_LENGTH> &MyArray, std::function<bool(unsigned int, unsigned int)> function) { #pragma omp parallel for for (unsigned int index = 0; index < MAX_LENGTH; ++index) { #pragma omp parallel for for (unsigned int AnotherIndex = 0; AnotherIndex < MAX_LENGTH; ++AnotherIndex) { if (function(MyArray[index], MyArray[AnotherIndex])) { std::swap(MyArray[index], MyArray[AnotherIndex]); } } } } void PrintArrayElements(const std::array<unsigned int, MAX_LENGTH> &MyArray) { for (const auto &item : MyArray) std::cout << item << std::endl; } void RandomizeArray(std::array<unsigned int, MAX_LENGTH> &MyArray) { std::mt19937_64 Random(static_cast<int>( std::chrono::high_resolution_clock::now().time_since_epoch().count())); std::uniform_int_distribution<> RandomGenerator(0, 1000); #pragma omp parallel for for (unsigned int index = 0; index < MAX_LENGTH; ++index) MyArray[index] = static_cast<unsigned int>(RandomGenerator(Random)); } int main() { std::array<unsigned int, MAX_LENGTH> MyOrginalArray; RandomizeArray(MyOrginalArray); SortArray(MyOrginalArray, Compare); PrintArrayElements(MyOrginalArray); return 0x0000; }
  14. بهنام صباغی

    اره دیگه اگر صرف زمان مهم بود کتابخونه معرفی میکردم که با پارالل کردن فور بدون تغییر زیاد توی کد بتونی سرعتت رو خیلی زیاد کنی مثلا استفاده از openmp میتونه خیلی کمک کنه
  15. بهنام صباغی

    اره منم تغییر نمیدادم ولی چند روزی هست درگیر بهینه سازی هستیم جالبه که فعال کردن این فلگ ها علاوه بر بالا بردن سرعت باعث میشه کد اسمبلی یکم پیچیده تر بشه و برای مهندسی معکوس سخت تر بشه کار اینطور که شنیدم ولی تست نکردم هنوز .
  16. بهنام صباغی

    سلام بر حاج قاسم با تست اول به طور طبیعی روی لینوکس و لپتاپ خودم با کامپایلر g++-8 خروجی شد : 315 ثانیه معادل 5.25 دقیقه حالا تست دوم با تنظیم کردن دو تا فلگ برای بهینه سازی فلگ های -O3 و -ffast-math نتیجه شد : 26 ثانیه بدون دست بردن توی کد تونستم با ست کردن فلگ بهینه سازی زمان رو کاهش بدم.
  17. بهنام صباغی

    عه سلام فکر میکردم راهنمایی کردم الان دیدم نکردم . ببین باید ابجکت جیسانت رو درست کنی بعد یه تابع داره برای تبدیل به استرینگ : QJsonObject jsonObj; // assume this has been populated with Json data QJsonDocument doc(jsonObj); QString strJson(doc.toJson(QJsonDocument::Compact)); بعد میتونید استرینگ رو به روش دلخواه بفرستید به کیو ام ال و اونجا پارسش کنید.
  18. بهنام صباغی

    سلام خب این یک مقدار نیاز به توضیح داره ولی در کل روندش از سی میک یکیش اینه که شما با find_package باید کتابخانه رو پیدا کنید و بعد باید کتابخونه و آدرس اینکلود رو به قسمت هایی از پروژه که نیاز هست اضافه کنید. این مثال کوچیک رو از اضافه کردن کتابخانه‌های boost ببینید : cmake_minimum_required(VERSION 2.8.12) project(UCCP_Server_Boost) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) include_directories(./src) #seting file pathes file(GLOB Headers ./src/*.h) file(GLOB Cpp ./src/*.cpp) #library add_library(Server ${Headers} ${Cpp} ) set (CMAKE_CXX_STANDARD 14) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=gnu++14 -D__STRICT_ANSI__") find_package (Threads) find_package(Boost 1.58 REQUIRED COMPONENTS date_time filesystem iostreams thread) if(Boost_FOUND) include_directories(${Boost_INCLUDE_DIRS}) add_executable(${PROJECT_NAME} "posix_main.cpp" ) target_link_libraries(${PROJECT_NAME} Boost::date_time Boost::filesystem Boost::iostreams Boost::thread ${CMAKE_THREAD_LIBS_INIT} Server ) endif(Boost_FOUND) set(Boost_USE_STATIC_LIBS ON) # only find static libs set(Boost_USE_MULTITHREADED ON) set(Boost_USE_STATIC_RUNTIME OFF) توی این مثال با find_package کتابخانه های مختلف رو پیدا کرده بعد چک کرده که اگر پیدا شده بود بیاد لینکشون کنه و با include_directories(${Boost_INCLUDE_DIRS}) فایل های اینکلود رو اضافه کرده . برای بقیه کتابخانه ها هم همینند فقط اگر کتابخانه ای با سی میک نوشته شده باشه احتمالا یک سری پارامتر اختصاصی هم داره که کلا متغیر رو میشه با set تنظیم کرد اون چند مورد پایین هم وقتی مثلا مقدارشون ON باشه احتمالا خود کتابخانه با توجه به تعریف شدن اینها یا مقدارشون کاری رو انجام میده . ولی نکته دیگه مرحله قبل از سی میک هست این که سی میک از کجا میفهمه کتابخانه کجاست این بر میگرده به نحوه معرفی سیستم‌عامل اگر توی ویندوز هستید میتونید با اضافه کردن آدرس کتابخانه به path مطمئن بشید که سی میک دنبالش میگرده و اگر تیو لینوکس هستید path environment رو سی میگ ملاک قرار میده پس باید یا ایمورت کنید path رو بهش یا توش تعریف شده باشه اما راه دیگه که خیلی هم اصولی نیست اینه که دستی توی فایل سی میک مسیر مورد نظر رو به پرفیکس اصافه کنید تا سی میک اونجا رو هم دنبال کتابخانه مورد نظر بگرده و مقادیری که نیاز هست رو مقدار دهی کنه . در کل سی میک تقریبا اندازه یک زبان کامل قابلیت داره باید یه وقت درست درمون بذارید برای یاد گیریش این هم لینک مثال اضاف کردن کتابخانه‌های کیوت در CMAKE میتونید از این مورد هم کمک بگیرید برای درک کلی قضیه. موفق باشید
  19. بهنام صباغی

    دوست خوبم شهریار زحمت کشید یه برنامه نوشت که به صورت گرافیکی هم بشه خروجی باینری با فایل‌های کتابخانه کنارش رو درست کرد و یک اسکریپت برای اجرا کردن چون سیستم لینک دهی توی لینوکس به یه شکل دیگست ولی میشه اینطوری انجامش داد : دیپلوی گرافیکی وابستگی‌های برنامه Qt Quick :: Modern Cpp
  20. بهنام صباغی

    من ویدئو رو ندیدم ولی فکر میکنم برای پلتفرم ویندوز توضیح داده باشید بهتره ذکر کنید.
  21. بهنام صباغی

    سلام یک مقداری وقت گذاشتم یه مثال تر و تمیز درست کنم که لپ مطلب توش باشه ولی بعد بیخیال شدم گفتم سر نخ بدم خودتون تلاش کنید که هم یاد بگیرید هم یادتون بمونه ببینید اون روش قدیمی تعریف رل خیلی جالب نیست یعنی به اعتقاد من روشی خوبه که بشه بدون دست بردن توی کد هم به مدل موارد مورد نیاز رو اضافه کرد . یک نگاهی به این بندازید داره از JSONListModel استفاده میکنه شما هم میتونید دیتایی ک دارید رو در قالب یک استرینگ جیسان در بیارید و بفرستید کیو ام ال و اونجا از همین روش برای نشون دادن استفاده کنید . نتیجش رو منتشر کنید . موفق باشید.
  22. بهنام صباغی

    سلام جیسان یک استاندارد برای ذخیره اطلاعات هست و چون ساختار تمیزی داره برای ای پی ای و جاهای دیگه هم کاربرد داره این که شما میفرمایید استفاده از json در برنامه نویسی ویجت یک مقداری نا مفهوم هست. برای هندل کردن و خواندن و در کل کار با جیسان توی کیوت کلاس هایی وجود داره که میتوانید از بخش JSON Support in Qt مشاهده کنید. اما اگر منظورتون از استفاده از جیسان در کیو ویجت برای طراحی رابط کاربری یا نمایش لیست و تیبل و ... هست که باز روند های خودش رو داره برای لیست و ... فکر میکنم باید تبدیل به مدل بکنید و برای طراحی داینامیک که مثلا طبق جیسان خودکار اپ تغییر حالت بده هم باید کاملا دستی هندل کنید مثلا باید در نظر بگیرید label برچسب هست و هر جیسان زیرین یه لایه جدید و نوع لایه هم توش هست مثلا همچین جیسانی رو دریافت کنید { "direction":"ltr", "label":"my dynamic Label" } یعنی فکر میکنم منطقی هست که یکبار بنویسید با توجه به جیسان ورودی چطور طراحی انجام بشه و بعد از اون فقط جیسان رو طراحی کنید و بفرستید برنامه خودکار شکل بگیره. موفق باشید
  23. بهنام صباغی

    سلام این میاد این رویداد رو میگیره و اگر event.accepted را برابر true قرار دهیم به این معنی است که این رویداد را پذیرفته ایم و دیگر کسی مسئولیتی برای اجرای آن ندارد و بنابر این هر کدی که اجرا کنیم کدی است که به ازای فشرده شدن کلید بازگشت فراخوانی می‌شود: Rectangle { focus: true // important - otherwise we'll get no key events Keys.onReleased: { if (event.key == Qt.Key_Back) { console.log("Back button captured - wunderbar !") event.accepted = true } } } موفق باشید.
  24. با توجه به تحریم‌ها و سیاست‌های ضد ایرانی گوگل به نظرم بهتره حالا که داریم زمان میذاریم توسعه نقشه رو بر پایه API پارسیجو پیش ببریم یا حداقل طوری باشه که با پارسیجو هم سازگار باشه . پارسیجو یک شرکت ایرانی هست که با موتور جستجو کارش رو شروع کرد ولی خیلی فعال و با کیفیت پیش رفت . الان هم یک API تمیز برای نقشه ارائه داده که با نگاهی که من انداختم ارزش وقت گذاشتن داره. مورد دیگه ای که به نظرم نیاز هست نمودار در کیوت هست من این مدت داشتم روی نمودار توی کیو ام ال و ویجت وقت میگذاشتم متوجه شدم در حال حاضر نمودارها در کیوت بر پایه Graphics View Framework که طبق مطالعاتی که روش داشتم اصلا به درد نمیخوره علیرقم این که بسیار پر استفاده هست در صورتی که میخواید بیشتر بدونید میتونید جستجو کنید و ویدئو QtWS16- The Curse of Choice: An Overview of GUI technologies in Qt, Andy Nichols, The Qt Company هم لپ مطلب رو توضیح میده. تازه وضعیت توی کیو ام ال حتی بدتر از وضعیت توی QGraphicsView خود سی پلاس پلاس هست چون توی سی پلاس پلاس به QGraphicsScene دسترسی داریم برای اضافه کردن موارد گرافیکی دیگه ولی توی کیو ام ال به اون هم دسترسی نداریم و مثلا برای کشیدن یک مستطیل برای انتخاب کردن یک قسمت از چارت باید کلی دردسر بکشیم. در کل به نظرم نیاز هست با QQuickItem و بر پایه Scene Graph زده بشه که البته این مورد رو مدتی هست شروع کردم ولی به دلیل مشغله زیاد وقت نکردم تمومش کنم و فعلا برای کشیدن نمودارهای خطی استفاده داره که البته هنوز Axis رو هم نشون ندادم روش و دنبال روشی بودم که بشه از تو سی پلاس پلاس و بدون نیاز به کیو ام ال تکست رو هم رندر کنم ولی انگار چاره ای نیست فعلا و باید به صورت داینامیک متن از سی پلاس پلاس توی یکو ام ال درست کنم و موقعیتشون رو تنظیم کنم که البته روش کثیفی به نظر میرسه. در کل این لینک پروژه چارت بر پایه QQuickItem هست که تصمیم دارم تکمیلش کنم و علاوه بر اون میخوام نقشه بر پایه QQuickItem رو هم شروع کنم که البته اون رو بخش تحقیقش رو انجام دادم و در صورتی که زمان داشته باشم میشینم پاش و هیچ چالشی برای انجامش ندارم البته ممکنه سر همین رندر کردن متن توی پاپ آپ به همین مشکل بخورم توش که اون مشکل خاصی نیست میشه به همین روش داینامیک انجامش داد . پس پیشنهادات من این دو مورد هست : افزودن نقشه پارسیجو توسعه نمودارها بر پایه QQuickItem و Scene Graph و این هم لینک پروژه نمودار که البته تازه شروعش کردم ولی خوشحال میشم دوستان همکار کنند و نگاهی بهش بندازند .
  25. بهنام صباغی

    با سلام در مورد دیتابیس باید خدمتتون عرض کنم بهتر هست کلاس کار با دیتابیس رو توی سی پلاس پلاس بنویسید و به صورت ماژول ازش استفاده کنید. الان مثالی نزدیک دستم نیست ولی کلیت به این صورت هست که شما یک کلاس برای کار با دیتابیس میسازید و توی کیو ام ل با اون کار می‌کنید. برای مثلا کلاس DatanaseManager رو می‌نویسید که تابع AddUser داره و ورودی فیلدهای ساختار داده کاربر رو می‌گیره و توی سی پلاس پلاس شما توی این تابع دیتابیس رو باز می‌کنید و اطلاعات ورودی رو ذخیره می‌کنید . بعد این کلاس DatanaseManager رو که از QObject به ارث برده توی کیو ام ال استفاده می‌کنید البته باید این رو بگم که دو روش برای استفاده هست که یک روش ریجستر کردن کلاس هست و اینطوری باید توی کیو ام ال ایمپورت بشه و ازش شی ساخته بشه و ... که این رو خیلی برای دیتابیس پیشنهاد نمی‌کنم چون اگر مثلا دیتابیستون اس کیو لایت باشه ممکنه چندین کانکشن به یک شی به وجود بیاد در لحظه و مشکلساز بشه و ایمپورت کردن و نمونه ساختن از دیتابیس توی هر فایل کیو ام ال هم اصلا جالب به نظر نمیاد. بهتره یک شی توی سی پلاس پلاس از کلاس دیتابیس درست کنید و اون رو با QQmlContext بفرستی به کیو ام ال و اینطوری توی تمام قسمت‌های QML در دسترس هست. اینم یه مثال خیلی کوچیک از فرستادن با QQmlContext در مورد باز شدن هم که جناب اسدزاده توضیح دادند یک روش ساخت آبجکت داینامیک هست با createComponent و روش دیگه هم همین هست که همه رو توی کامپوننت بنویسی و در زمان نیاز سورس لودرت رو ست کنی.
×
×
  • جدید...