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

کامبیز اسدزاده

بنیـــان گذار
  • تعداد ارسال ها

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

  • روز های برد

    266

پست ها ارسال شده توسط کامبیز اسدزاده


  1. در 11 ساعت قبل، Mohammad Rahbari Doust گفته است :

    سلام

    من میخوام کتابخونه tz رو توی پروژه کیوت استفاده بکنم ولی لینک ارور میده .ظاهرا باید از cmake استفاده کرد اما بلد نیستم. منابع خوب و سریعی هم اگر دارید معرفی کنید . تشکر

    سلام،

    خطای لینکر مبنی بر این است که فایل ساخته شدهٔ کتابخانه قابل شناسایی نیست.

    قبل از هر چیز دستورات زیر را به ترتیب برای کامپایل (ساخت) کتابخانهٔ tz اجرا کنید تا فایل‌ libtz.a ساخته شود.

    mkdir build
    cd build
    cmake ../
    cmake -DENABLE_DATE_TESTING=ON --build .
    make

    در نهایت وارد یک پروژهٔ جدید بشید تا برای افزودن کتابخانه به صورت زیر عمل کنید:

    1. فایل libtz.a را در یک پوشه‌‌ای با نام lib و محتوای کتابخانه را در پوشه‌ای با نام include در کنار پروژهٔ خودتان قرار دهید.
    2. به دلیل اینکه این کتابخانه وابستهٔ کتابخانهٔ curl است، مطمئن شوید که آن نیز بر روی سیستم شما نصب باشد.

    دستورات زیر را در سی‌میک برای افزودن کتابخانهٔ libtz بنویسید.

    add_library( date ${CMAKE_CURRENT_SOURCE_DIR}/include )
    link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)
    target_link_libraries(${PROJECT_NAME} PRIVATE tz)

    احتمالاً خطایی برای عدم توانایی لینک‌سازی با curl دریافت کنید، در این صورت دستورات زیر را در سی‌میک اضافه کنید:

    FIND_PACKAGE(CURL)
    IF(CURL_FOUND)
      INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR})
      SET(requiredlibs ${requiredlibs} ${CURL_LIBRARIES} )
    ELSE(CURL_FOUND)
      MESSAGE(FATAL_ERROR "Could not find the CURL library and development files.")
    ENDIF(CURL_FOUND)
    
    target_link_libraries(${PROJECT_NAME} PRIVATE curl)
    

    یک مثال از پروژه‌ای که من libtz را همراه کیوت ادغام کردم:

    cmake_minimum_required(VERSION 3.5)
    
    project(HelloCMake LANGUAGES CXX)
    
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
    
    set(CMAKE_AUTOUIC ON)
    set(CMAKE_AUTOMOC ON)
    set(CMAKE_AUTORCC ON)
    
    set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    
    find_package(Qt5 COMPONENTS Widgets REQUIRED)
    
    FIND_PACKAGE(CURL)
    IF(CURL_FOUND)
      INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR})
      SET(requiredlibs ${requiredlibs} ${CURL_LIBRARIES} )
    ELSE(CURL_FOUND)
      MESSAGE(FATAL_ERROR "Could not find the CURL library and development files.")
    ENDIF(CURL_FOUND)
    
    add_library( date ${CMAKE_CURRENT_SOURCE_DIR}/include )
    link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)
    
    if(ANDROID)
      add_library(HelloCMake SHARED
        main.cpp
        mainwindow.cpp
        mainwindow.hpp
        mainwindow.ui
      )
    else()
      add_executable(HelloCMake
        main.cpp
        mainwindow.cpp
        mainwindow.hpp
        mainwindow.ui
      )
    endif()
    
    target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets)
    target_link_libraries(${PROJECT_NAME} PRIVATE tz)
    target_link_libraries(${PROJECT_NAME} PRIVATE curl)
    

    بعد از این نباید در زمان کامپایل خطایی رُخ دهد. موفق باشید!

    • ترکوندی! 1

  2. در 1 ساعت قبل، قاسم رمضانی منش گفته است :

    در حالت عادی، ویجت QSlider به این‌صورت نمایش داده می‌شود :

    image.png.4e223566a66d9327142e3593f55da352.png

    برای رنگ بندی نوار QSlider، چه پیشنهادی دارید ؟ مثلاً به این‌صورت :

    image.png.803958b373c63a499fab74956b81192d.png

    از مشخصهٔ setStyleSheet تحت CSS کار کن، مثال زیر رو ببین:

    QSlider::groove:horizontal {
    border: 1px solid #bbb;
    background: white;
    height: 10px;
    border-radius: 4px;
    }
    
    QSlider::sub-page:horizontal {
    background: qlineargradient(x1: 0, y1: 0,    x2: 0, y2: 1,
        stop: 0 #66e, stop: 1 #bbf);
    background: qlineargradient(x1: 0, y1: 0.2, x2: 1, y2: 1,
        stop: 0 #bbf, stop: 1 #55f);
    border: 1px solid #777;
    height: 10px;
    border-radius: 4px;
    }
    
    QSlider::add-page:horizontal {
    background: #fff;
    border: 1px solid #777;
    height: 10px;
    border-radius: 4px;
    }
    
    QSlider::handle:horizontal {
    background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
        stop:0 #eee, stop:1 #ccc);
    border: 1px solid #777;
    width: 13px;
    margin-top: -2px;
    margin-bottom: -2px;
    border-radius: 4px;
    }
    
    QSlider::handle:horizontal:hover {
    background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
        stop:0 #fff, stop:1 #ddd);
    border: 1px solid #444;
    border-radius: 4px;
    }
    
    QSlider::sub-page:horizontal:disabled {
    background: #bbb;
    border-color: #999;
    }
    
    QSlider::add-page:horizontal:disabled {
    background: #eee;
    border-color: #999;
    }
    
    QSlider::handle:horizontal:disabled {
    background: #eee;
    border: 1px solid #aaa;
    border-radius: 4px;
    }

    البته ساختن چنین مواردی رو من در QML پیشنهاد می‌کنم.


  3. در 6 دقیقه قبل، نیما غراب گفته است :

    @کامبیز اسدزاده

    دستتون درد نکنه خیلی ممنونم. این کدی که گفتین نتیجه عکسی میشه که پیوست کردم؟

    مستطیل سبز یک Field هست که همزمان از دو نوع فونت برای نمایش متن استفاده شده فارسی بی نازنین هست و انگلیسیش تایمز نیو رومن.

    595117642_MultipleTextinSameField.jpg.a31aba1b367edc7a722ccc16fb7e4766.jpg

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

    خب فونت کل متن تغییر خواهد کرد! و این روش درستی هست. اما اگر می‌خواهید در بحث درون‌خط متنی که نوشتی یعنی «سلام بر World در زبان ++C» متن فارسی جدا و انگلیسی جدا تغییر کنند باید به فکر فونت فارسی باشی که داخلش از لاتین‌های سفارشی استفاده می‌کنه. مثل صمیم، ساحل و یا فونت‌های تجاری دیگر.

    در این صورت هم نیاز نیست دو تا فونت معرفی کنی، همون یک مدل کافی هست، به شرطی که از فونت لاتین استفاده کند.

    • تشکر شده 1

  4. در 14 دقیقه قبل، نیما غراب گفته است :

    @کامبیز اسدزاده

    آقا کامبیز اگر بخوایم همزمان دو یا هر چند نوع فونتی که بخوایم رو در یک TextFieldیا TextInputیا... داشته باشیم باید چه کنیم؟

    تغییر خاصیت font.family باعث میشه فونت کل متن باهم عوض شه در حالی که چیزی که مد نظر منه این هست که هرچی کارکتر فارسی هست فونتشون مثلا بی نازنین باشه و هرچی انگلیسی هست تایمز نیو رومن منتهی در یک TextFieldیا TextInputیا...

    الان با localeمیشه تشخیص داد کارکتر وارد شده انگلیسی هست یا فارسی ولی نمیدونم چه طوری باید همزمان روی یک متن دو یا چند نوع فونت رو اعمال کرد!

    سپاس گزارم.

    سادست، کافیه یک دستور شرطی ساده براش در نظر بگیری، مثل نمونهٔ زیر:

    property bool isLatin : false
    ..
    ...
    ....
    
    Text {
      font.family: isLatin ? fontSystem.getEnglishFont.name : fontSystem.getPersianFont.name
      ..
      ....
    }
    

     

    • تشکر شده 1

  5. در 3 ساعت قبل، نیما غراب گفته است :

    سلام بر دوستان و اساتید گرامی.

    پایه و اساس قیمت گذاری یک برنامه C++ چگونه هست؟

    با سپاس فراوان.

    پاسخ به این سوأل صرفاً از نظر نوع زبان کافی نیست و شاید منطقی نباشد. و چون ساختار و قوانین تحت چهارچوب مشخصی برای این موضوع نداریم، از نظر من دلایل بسیاری وجود دارد که بر روی قیمت‌گذاری می‌تواند تأثیرگذار باشد که به آن‌ها اشاره می‌کنم:

    • تجربه و کیفیت خدماتِ قابل ارائهٔ فرد یا شرکت توسعه‌دهنده جهت انجام آن
      • اینکه شخص یا شرکت مربوطه بتواند تضمین کند یا آسودگی خاطر را به مشتری بدهد که پروژهٔ آن در زمان مشخص با نتیجهٔ قابل قبول ارائه خواهد شد بسیار مهم است، قطعاً اطمینان خاطر و جلوگیری از احتمالات دوباره‌کاری و نا رضایتی خودش ارزشمند خواهد بود که ممکن است در هزینهٔ نهایی پروژه موثر باشد.
    • تضامین و خدمات پس از فروش «پشتیبانی، به‌روز‌رسانی و غیره»
      • هرچند پشتیبانی و به‌روزرسانی محصولات نرم‌افزاری یکی از مراحل توسعه و چرخهٔ نرم‌افزار است، اما در دسترس بودن و تضمین پشتیبانی از سمت توسعه‌دهنده قطعاً در هزینه‌های آن نسبت به دیگر موارد متفاوت خواهد بود.
    • نوع قرارداد و مذاکراتی که ممکن است طرفین در قبال تعهد به آن‌ها هزینه‌هایی را اضافه کند
      • معمولاً در قرارداد‌های طرفین به نکاتی اشاره می‌شود، مانند: در دسترس بودن منبع‌کد «سورس‌کد» و یا مستند سازی غیر معمول و اختصاصی که حتماً در قیمت نهایی یک محصول و پروژه موثر خواهد بود.
    • محدودیت‌ها و دلایل قانع کننده برای انتخاب یک ابزار و نیاز به دانش و مهارت‌های تخصصی
      • ممکن است پروژه‌ای که به شما پیشنهاد می‌شود، با یک سری محدودیت‌های فنی بر اساس نوع زبان، مهارت و بستر‌های پیاده‌سازی مواجه باشد که با توجه به ارائهٔ راه‌کار‌های مناسب توسط متخصص «توسعه‌دهنده» که واقعاً نیاز به تجربه و دانش در حل آن است وابسته خواهد بود. در چنین حالت‌های ارزش حل مسائل می‌تواند در خود پروژه تأثیر‌ بگذارد.
      • در نهایت بعد از بررسی موارد این چنینی که من تنها به برخی از آن‌ها اشاره کردم، می‌توانید به خروجی‌ها و نتایج حاصل از خود ابزار که در اینجا «++C» است اشاره کرده و مشتری را نسبت به آن قانع کنید. برای مثال، ویژگیِ چند-سکویی خود به تنهایی یک مزیت بسیار بزرگ است که می‌تواند در حذف هزینه‌های احتمالی مانند بازنویسی در زمان توسعه و به‌روز رسانی در قالب سکو‌های مختلف موثر باشد.
    • نوع مذاکره در ساخت و توسعه در قالب زمان مشخص
      • برای ساده‌سازی مسئله و حل باید‌ها و نباید‌ها نیز مشخص سازی یک نرخ یا رنج قیمت برای کار بر روی پروژه می‌تواند موثر باشد. برای مثال، بر اساس تعداد ساعت و زمان مشخص در روز می‌توانید یک محاسبهٔ مشخصی برای مشتری خود انتقال دهید تا هم زمان تحویل و هم مدت زمات مورد نیاز برای توسعه را بداند.

    دربارهٔ همین موضوع چند-سکویی که تنها یک ویژگی از مزایای سی‌پلاس‌پلاس است مثالی بزنم:

    فرض کنید قرار است مشتری یک نرم‌افزار تحت موبایل از شما درخواست کند، در این صورت اگر قرار باشد منطقی مذاکره کنید، بهتر است مشتری را متوجه این سازید که برای ساخت یک اپلیکیشن در سکو‌های مختلف مانند iOS، Android و غیره نیاز به تخصص، زمان و هزینه‌های جدا از هم است. اما اگر شما به عنوانی توسعه‌‌دهندهٔ تمام عیار فول‌اِستک هستید، می‌توانید مشتری را قانع کنید که صرفاً با یکپارچه‌سازی کد‌های توسعه و ساختار بهینهٔ برنامه‌های نوشته شدهٔ تحت سی++ از صرف هزینه‌های احتمالی جهت توسعه‌ جلوگیری می‌کنید و حتی در آینده نیازی نیست هزینه‌های اضافه بر مشتری تحمیل کنید.  در این رابطه باید به یک هزینهٔ قابل قبول همراه با حفظ ارزش‌های وارده را مطرح کنید.

    برای مثال، اگر قرار است یک اپلیکیشن برای دو پلتفرم مختلف توسعه یابد، اگر قیمتی بابت یک نرم‌افزار در دو سکوی مختلف استعلام و یا تخمین زده شده باشد، بهتر است شما با در نظر گرفتن نصف و یا حد‌اکثر دو سوم آن همان کارها را با حفظ ارزش‌های فنی و کاربری مشتری انجام دهید. بر اساس چنین مواردی نیازی به افزایش یا کاهش هزینه‌ها در یک پلتفرم وجود ندارد چرا که تنها کاری که انجام خواهید داد هم‌گردانی «کامپایل» کد‌ها بر روی پلتفرم دیگر خواهد بود.

    • پسندیدن 2
    • تشکر شده 1

  6. در 7 ساعت قبل، نیما غراب گفته است :

    @کامبیز اسدزاده دستتون درد نکنه خیلی ممنونم.

    خب مشکل من الان همین isLatin هست که نمیدونم چه طوری باید در زمان اجرا با توجه به اینکه کاربر، کیبوردش رو روی چی گذاشته باشه تغییرش بدم!

    رویدادی یا سیگنالی برای اینکار وجود نداره که مثلا هروقت کاربر زبان تایپ رو عوض کرد بشه ازش مطلع شد و نوعشم فهمید؟

    سمت سی‌پلاس‌پلاس کدی تدارک ببینید که وضعیت لایهٔ زبانی روی صفحه‌کلید رو بررسی و به سمت کیو‌ام‌ال پاس بده.

    در آخرین تغییراتِ کیوت، از کدی مشابه زیر می‌تونید استفاده و روش مورد نظر خودتون رو پیاده کنید:

     QGuiApplication app(argc, argv);
     QLocale locale;
     app.inputMethod()->locale().setDefault(QLocale::English);
     qDebug() << app.inputMethod()->locale().language();

    مقداری که چاپ می‌شه رو در یک روش بهتر در قالب کلاس و تابعی مشتق شده از QObject به سمت QML پاس بدین.

    • ترکوندی! 1

  7. در 4 دقیقه قبل، نیما غراب گفته است :

    سلام بر دوستان گرامی و اساتید ارجمند.

    چه طوری در QML/Qt Quick میشه در یک TextArea یا دیگر اشیا مرتبط با تایپ متن، جوری تعریف شن تا وقتی کیبورد روی فارسی هست از فونت مثلا بی‌نازنین استفاده شه برای تایپ و وقتی کیبورد به زبان انگلیسی تغییر پیدا کرد از فونت مثلا تایمز نیو رومن استفاده شه؟ آیا اصلا QML یک همچین مکانیزمی رو در اختیار ما در سمت رابط کاربری قرار میده یا باید از خود C++ کمک گرفت؟

    سپاس گزارم.

    درود،
    دو تا سیستم فونت تعریف کنید، یکیش لاتین برای انگلیسی و دیگری فونت مورد نظر برای فارسی. برای مثال، همچین چیزی رو در نظر داشته باشید:

    
        FontLoader {
            id: fontEnglish
            source: "english-font.ttf"
        }
        
        FontLoader {
            id: fontPersian
            source: "persian-font.ttf"
        }
    

    در نهایت در یک دستور شرطی با توجه به واکنش بر اساس مشخصهٔ فکوس و یا هر چیزی که نیاز هست فونت‌ها رو اعمال کنید. برای مثال به صورت زیر:

        TextField {
            //Todo...
            property bool isLatin : false
            font.family: isLatin ? fontEnglish.name : fontPersian.name 
            onPlaceholderTextChanged: {
              //ToDo...
            }
        }

     

    • پسندیدن 1

  8. در 21 ساعت قبل، amirb گفته است :

    با سلام.

    از آن جایی که در پنل کافه بازار فقط یک فایل apk که با همه ی معماری های پردازنده سازگار است می توان منتشر کرد با qt 5.12 چطور خروجی باید بگیریم که توسط همه ی پردازنده ها پشتیبانی بشه؟

    در نسخهٔ ۵.۱۲ نمی‌تونید پشتیبانی از همهٔ معماری‌ها رو در یک فایل ارائه کنید. برای پشتیبانی کامل اپلیکیشن شما از این قابلیت بهتره اون رو در قالب aab منتشرش کنید. در کیوت ۵.۱۳ این امکان هم وجود داره، در بخش تنظیمات زبانهٔ Advanced Action گزینهٔ Build .aab (Android App Bounlde) رو تیک بزنید.


  9. در در 30 آذر 1398 در 00:50، amirb گفته است :

    با توجه به روشی که توضیح دادید چکار کنیم که کتابخانه ی از نوع shared داخل خروجی امبد بشه؟(برای لینوکس و اندروید)

    روشی که توضیح داده شده بود به همین مدل اشاره داشت.
    باید توجه داشته باشید که فایل‌هایی با پسوند .a برای کتابخانه‌های ایستا و .so برای نوع داینامیک یا همون Shared هستند. البته باید توجه کنید حتماً روی کیت اندروید و لینوکس کتابخانه‌های مربوطه را کامپایل و به پروژه اضافه کنید.


  10. در ۱ ساعت قبل، moohin گفته است :

    خب چطور باید پیدا کنم برنامه هایی کوچیکی که برای شروع مناسبه از توی گیت هاب ؟

    از تکنیک جستجو در گوگل استفاده کنید.

    برای مثال عنوان برنامه + Github

    نتایجی که به دست میاد رو بررسی کنید. یا اینکه عنوان برنامهٔ مورد نظرتون رو در داخل گیت‌هاب جستجو کنید.

    • پسندیدن 1

  11. در 41 دقیقه قبل، amirb گفته است :

    سلام.خسته نباشید.

    می خوام از این کتابخانه در qt استفاده کنم و خروجی اندروید بگیرم.سیستمی هم که باهاش برنامه نویسی می کنم لینوکسی هست.باید نسخه ی اندرویدی این کتابخانه را بگیرم یا لینوکسی رو؟

    شما باید نسخهٔ اندروید رو دریافت کنید که مختصِ بستر اندروید ساخته شده است.

    در 41 دقیقه قبل، amirb گفته است :

    چجوری داخل پروژم اضافه کنم؟

    برای اضافه کردن به پروژه‌ هم به همین روشی که قبلاً توضیح داده شده ازش استفاده کنید.

    اگر مشکلی بود خطا و جزئیات رو بنویسید تا بررسی شود.


  12. در 3 ساعت قبل، moohin گفته است :

    سلام

    میخواستم بدون کجا میشه پروژه ها و برنامه هایی در ابعاد کوچیک و آزاد رو پیدا کرد و سورسشونو دید و ازشون یادگرفت؟

    بیشتر چون ایده ای برای برنامه نویسی توی ذهنم نیست دنبال این هستم برنامه های نوشته شده توسط افراد دیگه رو ببینم و یاد بگیرم که چطوری این کارو میکنن بعد از یادگیری قواعد برنامه نویسی .

    با تشکر

    درود،
    از Github استفاده کنید.

    • پسندیدن 1

  13. در کتابخانهٔ SFML کلاس Http این امکان را فراهم می‌کند تا به راحتی بتوانید تحت روش‌های Post، Get و Head درخواست‌های مورد نظر را دریافت و ارسال کنید. توجه داشته باشید این کتابخانه تنها از مباحث ابتدائی پروتکل Http پشتیبانی می‌کند.

    برای دسترسی و استفاده از این ویژگی کافی است سرآیند زیر را وارد کنید:

    #include <SFML/Network.hpp>

    سپس با فراخوانی فضای نام به صورت زیر، از کلاس مربوطه یک نمونه خواهیم ساخت:

    sf::Http http;

    به عنوان مثال کد زیر جهت آماده سازی برای ارسال به سمت سرور کافی است:

    #include <SFML/Network.hpp>
    
    sf::Http http;
    http.setHost("http://www.iostream.ir/");
    

    با توجه به نیاز‌های مربوط به این مبحث، ارسال مقادیر به یک صفحه و آدرس اینترنتی توسط Request و Response صورت می‌گیرد که جهت دسترسی به این ویژگی‌ها کافی است از کلاس‌ مربوطه به صورت زیر نمونه گرفته شود.

    sf::Http::Request request;
    request.setMethod(sf::Http::Request::Post);
    request.setUri("/page.html");
    request.setHttpVersion(1, 1); // HTTP 1.1
    request.setField("From", "me");
    request.setField("Content-Type", "application/x-www-form-urlencoded");
    request.setBody("para1=value1&param2=value2");
    
    sf::Http::Response response = http.sendRequest(request);

    در کد فوق، روش درخواست از نوع Post و یا Get مشخص می‌شود که از متد setMethod جهت اعمال آن استفاده شده است. در ادامه مشخصهٔ setUri صفحه و یا‌آدرسی را که قرار است اطلاعات به آن ارسال یا دریافت شود را مشخص می‌کند. نسخهٔ پروتکل http با مشخصهٔ setHttpVersion با مقادیر صحیح مقدار دهی می‌شود که در این مثال مقدار ۱ به عنوان پشتیبانی از پروتکل نسخهٔ Http 1.1 تعیین شده است.

    با توجه به ماهیت روش Post مقادیری که برای ارسال نیاز است را باید ارسال کنید، برخی از اطلاعات ارسالی مانند Content-Type و غیره توسط مشخصهٔ setField مشخص می‌شود و همچنین مشخصهٔ setBody پارامتر‌ها (ورودی‌هایی) که از طرف کاربر ارسال می‌شود را فراهم می‌کند.

    در نهایت کلاس Response جهت دریافت و مدیریت داده‌های ارسالی از سمت سرور را مدیریت می‌کند که برای دسترسی و چاپ اطلاعات تحت آن به صورت زیر خواهد بود:

    sf::Http::Response response = http.sendRequest(request);
    std::cout << "status: " << response.getStatus() << std::endl;
    std::cout << "HTTP version: " << response.getMajorHttpVersion() << "." << response.getMinorHttpVersion() << std::endl;
    std::cout << "Content-Type header:" << response.getField("Content-Type") << std::endl;
    std::cout << "body: " << response.getBody() << std::endl;

    مثال فوق وضعیت، نسخهٔ مرتبط با پروتکل مربوطه، مقدار Content-Type و همچنین اطلاعات ارسال شده در مشخصهٔ body را چاپ خواهد کرد.

    در ادامه مثال مشخصی را برای ارسال یک نظر را آورده‌ایم که به صورت زیر خواهد بود:

    #include <SFML/Network.hpp>
    #include <sstream>
    
    void sendComment(const std::string &message, const std::string &username)
    {
        // Prepare the request
        sf::Http::Request request("/comment.php", sf::Http::Request::Post);
    
        // Encode the parameters in the request body
        std::ostringstream stream;
        stream << "username=" << username << "&message=" << score;
        request.setBody(stream.str());
    
        // Send the request
        sf::Http http("http://www.iostream.ir/");
        sf::Http::Response response = http.sendRequest(request);
    
        // Check the status
        if (response.getStatus() == sf::Http::Response::Ok)
        {
            // Check the contents of the response
            std::cout << response.getBody() << std::endl;
        }
        else
        {
            std::cout << "Request failed" << std::endl;
        }
    }

    توجه داشته باشید که جهت بررسی وضعیت ارسالی از نمونهٔ response متد getStatus را می‌توان با شمارنده‌های موجود در کلاس Response مورد ارزیابی قرار داد.

    در نهایت در سمت سرور کد زیر می‌تواند مقادیر ارسال شده را دریافت و پاسخ دهد:

    <?php
        $username = $_POST['username'];
        $message = $_POST['message'];
        
        if (write_to_database($username, $message))
        {
            echo "Your comment has been added!";
        }
        else
        {
            echo "failed to write your message to database...";
        }
    ?>

    نکته: مثال‌های فوق صرفاً برای آشنایی با نحوهٔ استفاده از ویژگی مربوطه در این کتابخانه است، بنابراین بسیار ساده و فاقد کد‌های امنیتی و سفارشی است.


  14. سلام و درود،

    مدتی است از سرویس‌های کاوه‌نگار جهت استفاده در پروژه‌‌های خودم استفاده می‌کنم و مطمئنم یکی از بهترین سرویس‌دهنده‌های ایرانی در زمینهٔ پیام کوتاه است. متأسفانه همانطور که می‌دانید بسیاری از سرویس‌دهنده‌ها در ایران به خاطر عدم شناخت دقیق از اهمیت و کاربرد سی++ هیچ حرکتی در توسعهٔ سرویس‌های خود در رابطه با سی++ را نمی‌کنند. بنابراین، جدیداً تصمیم گرفتم کیت‌های توسعه در قالب رابط‌های برنامه‌نویسی مورد نیاز رو برای این چنین شرکت و سرویس‌ها آن ارائه کنم.

    معرفی سرویس پیام کوتاه کاوه‌نگار

    کاوه نگار با ارائه وب‌سرویس پیامک و تماس صوتی پیشرفته برای توسعه دهندگان ،امکان ارسال و دریافت پیامک و برقراری تماس اینترنتی را در اغلب سرویس های نرم افزاری مهیا می کند.

    اهمیت وجود این سرویس در زبان‌هایی مانند C و ++C

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

    ساختار اولیه خروجی سرویس کاوه‌نگار به صورت زیر است:

    {
        "return":
        {
            "status":404,
            "message":"متد تعریف نشده است"
        },
        "entries":
        {
            null
        }
    }

    در صورتی که مقادیر ارسالی صحیح و مطابق با اطلاعات کاربری موجود در کاوه‌نگار باشد نتیجهٔ برگشتی آن به صورت زیر خواهد بود:

    {
        "return": {
            "status": 200,
            "message": "تایید شد"
        },
        "entries": [
            {
                "messageid": 8792343,
                "message": "خدمات پیام کوتاه کاوه نگار",
                "status": 1,
                "statustext": "در صف ارسال",
                "sender": "10004346",
                "receptor": "0914XXXXXXX",
                "date": 1356619709,
                "cost": 120
            }
        ]
    }
    

    نمونهٔ اولیه که توسعه داده شده، با مفهوم اولیه جهت ارسال پیام کوتاه بر اساس کلید و شماره‌های ارسالی آماده شده که کد نمونهٔ آن به صورت زیر خواهد بود.

    #include <iostream>
    #include <Kavenegar>
    
    int main()
    {
    
      //! Your Api Key
      std::string apiKey {"Your Api-Key"};
      
      //! Kavenegar Default Sender Number 
      std::string senderLine {"10004346"};
      
      Kavenegar::KavenegarApi api(MethodType ,"10004346",apiKey);
      
      //ToDo.. try catch exception handling.
      api.send("09140000000","Hi!");
      std::cout << "Result : " << api.getResult(); //JSon Output
        
      return 0;
    }

    نکته: نمونهٔ ساخته شده کامل و با تمام جزئیات موجود در کاوه‌نگار تکمیل و توسعه داده خواهد شد.

    لینک مربوط به کیت توسعه در گیت‌هاب.

    جهت استفاده از این نمونه توجه داشته باشید که جهت اجرای وب‌سرویس آن نیاز به نصب Curl و RapidJson خواهید داشت.

    • ترکوندی! 1

  15. در 21 ساعت قبل، mahdikhi گفته است :

    سلام

    صرفا از این جهت این سوال را میپرسم که خب تا اینجای مطلبی که نوشتین برای بسیاری از افراد، همان طور خودتون گفتین دیوانگی بنظر میرسه پس چرا یکم این دیوانگی بیشتر نباشه؟.

    سلام،

    منظور از دیوانگی این هست که اکثراً در دنیای وِب با وجود زبان‌هایی مثل php و غیره اینطور در نظر داشته باشند که خب مگه می‌شه با سی++ چنین برنامه‌هایی رو هم طراحی کرد؟ خب این برمی‌گرده به اطلاعات کمی که داریم! برای مثال ما از ابتدای شروع یادگیری سی++ اینطور فکر می‌کنیم که سی++ فقط یک زبان دانشگاهی برای پاس کردن چهارتا نمرهٔ درسی هست!

    برای اینکه حقایق پنهان این زبان رو بشناسیم این پست رو قبلاً آماده کردم.

    برای مثال کافیه یک تحقیق صورت بگیره که سایت‌های بزرگی مثل فیسبوک، آمازون، گوگل و غیره اساسشون با سی++ هست. این کار منطقی و دلایل خودش رو داره (

    در 21 ساعت قبل، mahdikhi گفته است :

    یعنی یک سیستم کاملا سی++ رو بشه برای برنامه نویسی تحت وب پیاده کرد؟

    جاوا اسکریپت همیشه به عنوان یک ابزار خوب در سمت فرانت‌اند مطرح هست. منظور از سی++ این نیست که فرانتش رو هم با سی++ بنویسیم! طبیعتاً شما وقتی با Php یا موارد دیگر وب‌سایتی رو طراحی می‌کنید بخش فرانت و بک‌اندش رو جدا از هم ترکیب خواهید کرد.

    در این روش هم سمت رابط‌کاربری با HTML5, CSS3, JavaScript, Angular.JS و غیره امکان پذیر است. تمامی کد‌های منطقی سمت سی++ نوشته میشه که طبیعتاً نسبت به دیگر زبان‌ها مزایا و کیفیت خودش رو داره.

    در 21 ساعت قبل، mahdikhi گفته است :

    یعنی یک سیستم کاملا سی++ رو بشه برای برنامه نویسی تحت وب پیاده کرد؟

     

    بستگی داره منظورتون از سیستم کامل چی باشه!

    برای مثال یک وب‌سرور رو کامل می‌شه پیاده سازی کرد! اما طبیعتاً یک وب‌سایتی که شامل یک ظاهر از طراحی قالب شیک و یا گزینه‌های سمت کاربری هست (این دیوانگیه که با سی++ پیادش کنی) چون JS و HTML برای این کار ساخته شده! بنابراین شما می‌تونی با سی++ بک‌اند وب رو توسعه بدی و بقیه موارد رو با فناوری‌های مرتبط با خودش.

    در 21 ساعت قبل، mahdikhi گفته است :

     حتما ازاین که مثلا نودجی.اس هم بسیار سرعت خوبی داره و سروصدای خوبی هم به پا کرده که جاوااسکریپت در دوسمت برنامه نویسی وب وارد شده و سریعت بخشیده و.... هم زیاد شنیدین، ولی خب در بحث سرعت هنوز سی و سی++ رو نمیتونن رد کنن.

    مشتاق خوندن پستهای بعدی تون هستم.

    نود‌جی‌اِس ذاتاً در جاهایی که کم میاره با سی++ قابل توسعه هست. اما خب وقتی شما می‌تونی با سی++ مستقیم وارد بحث توسعهٔ وب بشی دیگه نگرانی کارایی نخواهی دات. البته اشاره کنم ماهیت سرعت در برنامه‌های تحت وب ذاتاً فقط بحث زبان نیست! برای مثال بحث‌های چند‌نخی، پردازش‌های موازی و غیره همه مهم هستند. حتی ممکنه شما با سی++ بهترین کد و سریع‌ترین نوعِش رو بنویسی اما با وجود یک کد خیلی ساده اما بد در سمت JS یا HTML از کارایی برنامه به شدت بکاهی!

    در 21 ساعت قبل، mahdikhi گفته است :

    مشتاق خوندن پستهای بعدی تون هستم.

    این مقاله صرفاً یک مقالهٔ آزمایشی بود، در مورد فریم‌ورک‌های قدرتمند سی++ به زودی به معرفی انواع آن‌ها و روش‌های توسعهٔ وب اشاره خواهد شد که طبیعتاً می‌توان به این نتیجه رسید که نه تنها دیوانگی نیست، بلکه ما با یک روند توسعه و فناوری‌های جدیدی مواجه هستیم.

    • پسندیدن 1

  16. در 8 ساعت قبل، سید محمد عباسی گفته است :

    سلام، اینکه کنترلوشون کرد، یعنی با استفاده از این کلمات کلیدی، میشه محدودشون کرد؟ که کدوم وارد بشن و کدوم وارد نشن، درسته؟ 

    منظور محدود کردن نیست، در واقع شما عمل تأیید یا امضاء برای یک شیء را جهت استفاده در یک کتابخانه یا برنامهٔ دیگر اعمال می‌کنید. این واژهٔ کلیدی به شما اجازه می‌دهد اطلاعات کلاس ذخیره شده را در مراحل کامپایل به لینکر مشخص کنید، با توجه به مثال مربوطه استفاده از این دستور اساساً با توجه به صِفتِ dllexport به لینکر می‌گوید که شیء مورد نظر برای استفاده صادر می‌شود که توسط سایر کتابخانه‌ها (DLL) یا برنامه‌ها قابل استفاده خواهد بود. در این حالت تعاریف مربوط به اعلان‌های موجود باید در برنامهٔ مشابه پیاده سازی شود، در غیر اینصورت خطای لینکر ساطع می‌شود. زمانی از این روش استفاده می‌شود که بخواهید DLL ای را ساخته و دیگر موارد را به آن لینک (پیوند) کنید.

    در صورتی که صفت dllimport مشخص شود عمل عکسِ آن صورت می‌گیرد؛ پیاده‌سازی‌های (implementation) مربوطه به آن برای استفاده در برنامهٔ شما وارد می‌شوند. استفاده از dllimport نیز یک گزینهٔ اختیاری است. در صورت استفاده از این کلیدواژه، کامپایلر کد کارآمد‌تری را تولید می‌کند. با این حال بهتر است شما برای دسترسی به نماد‌ها و اشیاء داده‌های عمومی از آن استفاده کنید.

    به مثال‌های زیر توجه کنید:

    __declspec(dllexport) void messageBox (std::string_view msg);
    __declspec(dllimport) void messageBox (std::string_view msg);

    معمولاً پیشنهاد می‌شود برای داشتن یک API خوب به صورت زیر پیاده سازی شود.

    #ifdef LIBRARY_API
    #define LIBRARY_API __declspec(dllexport)
    #else
    #define LIBRARY_API __declspec(dllimport)
    #endif

    نمونه مثال از فایل سرآیند:

    #ifndef MESSAGELIB_HPP
    #define MESSAGELIB_HPP
    #pragma once
    
    #include <iostream>
    #include <string_view>
    #include <string>
    
    #ifdef LIBRARY_API
    #define LIBRARY_API __declspec(dllexport)
    #else
    #define LIBRARY_API __declspec(dllimport)
    #endif
    
    class LIBRARY_API MessageBox
    {
      public:
      MessageBox();
      ~MessageBox();
    
      std::string_view message(std::string_view msg);
    };
    
    #endif // MESSAGELIB_HPP

    تعاریف مربوطه:

    #include "messagelib.hpp"
    
    MessageBox::MessageBox() {
    
    }
    
    MessageBox::~MessageBox() {
    
    }
    
    std::string_view MessageBox::message(std::string_view msg) {
      return msg;
    }

    استفاده از کتابخانه در برنامه‌ها یا کتابخانه‌های دیگر:

    #include <iostream>
    #include "messagelib.hpp"
    
    using namespace std;
    
    int main()
    {
    
      MessageBox msg;
      cout << msg.message("Hello Boy!") << endl;
      std::cin.get();
    
      return 0;
    }

     

    • تشکر شده 1

  17. در 8 دقیقه قبل، نیما غراب گفته است :

    سلام بر دوستان و اساتید گرامی.

    کاربرد کلمه کلیدی __decspec(dllexport) چیست و چه زمانی باید ازش استفاده کنیم؟

    سپاس گزارم.

    درود،

    واژهٔ کلیدی__decspec با صفتِ dllexport به شما اجازه می‌دهد تا توابع و متغیر‌ها را برای اعلان در مرحلهٔ ورود و خروج کنترل کنید. زمانی که بخواهید داده‌ها، توابع، کلاس‌ها و یا توابع عضو کلاس را از طرف DLL مورد استفاده قرار دهید از این کلمهٔ کلیدی استفاده می‌شود.

    • پسندیدن 1

  18. در 6 دقیقه قبل، سید محمد عباسی گفته است :

    پس فعلا در سطج آزمایشیه . ولی خوبه که گذاشتن واسه آزمایش ، توسعه‌دهندگان نرم‌افزار ، خوشحال بشن ?

    امیدوارم که تمام ایراداتش رفع بشه و توسعه‌دهندگان مشکلی نداشته باشن با این فریم‌ورک ، چون واقعا در سطح خودش عالیه. 

    آزمایشی نیست، نهایی شده هست.

    اما خب فعلاً جای کار داره و باید از سمت مرورگر‌ها و سرور‌ها به خوبی بهینه‌سازی بشه.

    در کل این ویژگی در کنار دیگر ویژگی‌های کیوت یکی از بهترین موارد است.

    • تشکر شده 1

  19. در 1 دقیقه قبل، سید محمد عباسی گفته است :

    ایول! با یه تیر ، چند نشون رو زدند! با این فناوری یعنی دیگه می‌تونیم در سمت وب و پلتفرم‌های مختلف با یک بار کد نوشتن چندین بار اجرا کنیم! این واقعا عالیه . 

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

    فعلاً به بلوغ نرسیده، باید در سمت مرورگر‌ها و سرور بهینه‌سازی بشه.

    • تشکر شده 1

  20. همانطور که می‌دانید اخیرأ فناوری وب‌اسمبلی (Qt for WebAssembly) معرفی شده است، توسعه‌دهندگان کیوت یک نمایشگر برای اجرای خروجی‌های QML در مرورگر طراحی کرده‌اند که به شما این امکان را می‌دهد تا کد‌های نوشته شدهٔ خود را در محیط مرورگر اجرا کنید.

    در این بخش می‌توانید آخرین نسخهٔ مرتبط با Qt Design Viewer را برای آزمایش پیدا کنید، نمایشگر Qt Design Viewer با چند طرح آماده برای آزمایش همراه است.

    qtdesignviewer-screenshot.png

    برای اجرای یک برنامهٔ سفارشی تحت QML، باید یک پروندهٔ qmlproject. که پروندهٔ اصلی QML است را تعریف کنید. این همان قالب اساسی پروژه است که توسط Qt Design Studio و Qt Creator برای پروژه‌های QML استفاده می‌شود. پوشهٔ پروژه باید به صورت یک فایل Zip فشرده شود و سپس در Qt Design Viewer بارگذاری گردد. همچنین می‌توانید از نسخهٔ Qt Design Studio 1.3 یک فایل منبع را از پروژه ایجاد کرده و بسته‌ای را که به صورت خودکار ایجاد شده است را بارگذاری کنید.

    آزمایش‌های مربوطه بر روی مرورگر‌های Safari، Chrome، FireFox و Edge انجام شده است و عملکرد اجرای QML در تمامی آن‌ها بسیار خوب است. البته زمان تدوین و پیکربندی به مرورگر شما بستگی دارد، اما عملکرد واقعی برنامه پس از اجرا همانند نسخهٔ دسکتاپ است.

    سیستم Qt Design Viewer همراه با اکثر ماژول‌های QML به عنوان بخشی از کیوت است که در نسخهٔ ۵.۱۴ ساخته شده است. همچنین، این محیط بر روی سیستم‌عامل‌های iOS و Android اجرا می‌شود که یک روش ساده را برای اجرای طرح‌های آزمایشی ارائه می‌کند.

    این فناوری جدید است، بنابراین در صورت مشاهدهٔ مشکلات آن را به تیم توسعه‌دهندهٔ آن گزارش دهید.

    • ترکوندی! 2

  21. در 1 ساعت قبل، فرهاد شیری گفته است :

    تصور کن! سیستم نرم افزاری حمل و نقل ریلی را توسعه دادید! در این سیستم به صورت گرافیکی تمام خطوط ریلی ایستگاه و تمام علائم مربوطه با جزئیات مشخص شده و همچنین نحوه حرکت قطارها در این سیستم به صورت لحظه ای نمایش داده میشه! بنابراین عمکلرد محیط گرافیکی کاربری نرم افزار خیلی حائز اهمیت هست که تمام المانها به درستی وظیفه خودشون را انجام بدهند، بنابراین ابزارهای مانتیورینگ عملکرد محیط کاربری برنامه ها خیلی مهم و کاربردی خواهد بود.

    مثالت انقدر خوب بود که گفتم متنی هم تشکر کنم ازت ?


  22. در در 23 مهر 1398 در 15:18، amirb گفته است :

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

    می خواستم بدونم Qt safe renderer چیه و به چه کاری میاد و چه زمانی باید ازش استفاده کرد.

    با تشکر

    خوشم میاد سوألت بسیار بسیار تازست!

    یعنی کیوت این فناوری رو چند روزی نیست معرفی کرده! ?

    همچین کاربرای فعالی داریم ما... احسنت ?

    به هر حال، من سعی کردم چند بار این ویژگی رو بخونم و اگر درست متوجه شده باشم، با توجه به درکی که از مستندات خودش داشتم باید همچین تعریفی داشته باشه که در ادامه باز‌نویسی کردم.

    در صنایع مختلفِ پزشکی و اتوماسیون‌های پیشرفته و یا خودرو‌سازی نمایش اطلاعاتِ ایمن، مرتبط با اطلاعات مربوط به خطا‌ها و گزارشات بحرانی که بسیار هم مهم و حساس هستند که متخصص‌ها باید به این اطلاعات در زمان خودش همراه با اطلاعات صحیح و ایمنی از طریق صفحه‌ نمایشگر‌های دیجیتالی در اختیار داشته باشند  مهم است. برای مثال در صنعت پزشکی، پرستاران، پزشکان و تکنسین‌ها از وسایل پزشکی بسیار مهمی استفاده می‌کنند که باید این تجهیزات به حداکثر ایمنی در زمان ارائهٔ گزارش‌ها در جای مناسب خودشون تضمین شوند.

    با توجه به مشکلات احتمالی که در زمان ارائهٔ این گزارشات در زمان رندر سازی سمت UI (که بسیار حساس هستند و نباید تأخیر و یا اختلالی در ارائهٔ این‌ موارد به وجود بیاد) کیوت سعی کرده راهکاری را ارائه بدهد تا این مشکلات احتمالی را تضمین و ایمن سازد.

    بنابراین، ماژول Qt Safe Renderer هم یک راهکار از طرف شرکت کیوت است برای ارائهٔ اطلاعات حساس و ایمن در برنامه‌های کاربردی ایمنی که عملکرد آن‌ها بر اساس کیوت است. این ماژول یک محصول تجاری است که باید جداگانه خریداری شود، زیرا بخشی از مجوز‌های توسعهٔ برنامه‌ یا دستگاه مربوط به این ویژگی بخشی از برنامه‌های کیوت محسوب نمی‌شوند.

    این راهکار برای این ارائه شده تا، یک سیستم جداگانه برای ادغام و یکپارچه‌سازی یک سیستم با پردازش‌های جداگانه جهت عملکرد‌های مهم ایمنی و غیر ایمنی باشد. با توجه به ساختاری که دارد، پردازش‌های مورد نیاز را به یک زیر سیستم مستقل در فرآیند اختصاصی اجرا می‌کند، مانند ظبط گرافیکی از اطلاعات مهم و ایمنی که این موارد را تضمین خواهد کرد. در واقع این راه‌کار، وظیفهٔ مانیتورینگ اصلی عملکرد رابط‌کاربری اصلی و خطاهای موجود در آن را بر عهده می‌گیرد تا اختلالی در زمان ارائهٔ اطلاعات مهم و حساس رُخ ندهد.

    • تشکر شده 1
×
×
  • جدید...