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

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

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

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

  • روز های برد

    266

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


  1. در 4 ساعت قبل، andeh گفته است :

    استاد شما برای  cms که ساختید از چه کتابخونه ای استفاده کردید؟

    این یک نسخهٔ مفهومی هست، نسخه‌ای که در زمان ارسال پست بر روی وب‌سایت ساخته شده با استفاده از Qt و Cutelyst بود.

    نسخهٔ بعدی از اون باز به عنوان مفهومی بر اساس Drogon Framework ساخته شده، و نسخه‌ای هم بر اساس Boost در دست توسعه هست.

    • پسندیدن 1

  2. در 31 دقیقه قبل، zahra گفته است :

    سلام

    در صورتی که بخوام میزان حافظه و cpu که برنامه مصرف می کنه رو به صورت دوره ای در برنامه نمایش بدم، چه روشی پیشنهاد می کنید؟

    ممنون

    سلام،

    برای این کار ابتدا سمت سی++ توابعی که باید مقادیر لحظه‌ای از مصرف منابع رو برای شما برگردونن رو پیاده‌سازی کنید، سپس برای ارسال و هماهنگی در سمت QML از WorkerScript استفاده کنید. 

    • پسندیدن 1

  3. در در 20 آبان 1398 در 15:20، ahmadsajedi گفته است :

    سلام خدمت کاربران محترم فروم.

    من تصمیم دارم وارد حوزه برنامه نویسی اندروید بشم. تجربه کد زنی دارم (html و وردپرس مقداری کار کردم). برای اندروید از کجا شروع کنم؟ چه زبانی؟ ممنون

    سلام،
    شما می‌تونید با جاوا و یا کاتلین شروع کنید.

    در این باره جستجو کنید و آموزش‌های مرتبط با این حوزه را دنبال کنید.


  4. در 2 ساعت قبل، Ali71321 گفته است :

    مهندس من با استفاده از کامپایلر ویژوال استودیو2010 بیلدش کردم و میخوام به کیوت ورژن 5.6 اضافه اش کنم

    از کامپایلر MSVC2017 و به بالا مثل MSVC2019 استفاده کن، این نسخه‌ای که به کار گرفتی حتی بتونی کامپایل هم کنی قطعاً مشکلاتی با این نسخه از بوست خواهد داشت.


  5. در 55 دقیقه قبل، zahra گفته است :

    در خروجی که میخوام مقادیر QByteArray  رو بخونم ، پیغام undefined نشون میده .برای یک متغییر bool  درست کار می کنه ولی برای آرایه که بعدا میخوام مقادیر فایل رو در اون لود کنم، خطا میده. ممنون میشم اگر تجربه ای دارید راهنمایی کنید.

    درود،

    کد شما کمی نا منظم بود، به هر حال پیشنهاد می‌کنم نیاز خود مشابه این روش پیاده‌سازی کنید.

    #ifndef MYCLASS_HPP
    #define MYCLASS_HPP
    
    #include <QObject>
    #include <QByteArray>
    
    class MyClass : public QObject
    {
        Q_OBJECT
        Q_PROPERTY(QByteArray arr READ arr WRITE setArr NOTIFY arrChanged)
        Q_PROPERTY(quint8 length READ length WRITE setLength NOTIFY lengthChanged)
    public:
    explicit MyClass(QObject *parent = nullptr);
        ~MyClass();
    
    public:
        const QByteArray arr() const;
        quint8 length() const;
    
    signals:
        void arrChanged();
        void lengthChanged();
    
    public slots:
        void setArr(const QByteArray& v);
        void setLength(quint8 l);
    
    private:
        QByteArray m_arr;
        quint8 m_length;
    };
    #endif // MYCLASS_HPP
    
    #include "myclass.hpp"
    #include <QDebug>
    
    MyClass::MyClass(QObject *parent) :
        QObject(parent)
    {
        QByteArray myArr;
        myArr.push_back("A");
        myArr.push_back("B");
        myArr.push_back("C");
        myArr.push_back("D");
        myArr.push_back("E");
        setArr(myArr);
    }
    
    MyClass::~MyClass() {
    
    }
    
    const QByteArray MyClass::arr() const {
        return m_arr;
    }
    
    quint8 MyClass::length() const {
        return m_length;
    }
    
    
    void MyClass::setArr(const QByteArray& v) {
    
        if(m_arr.isNull()) {
            m_arr = v;
            setLength(m_arr.length());
        }
        emit arrChanged();
    }
    
    void MyClass::setLength(quint8 l) {
        m_length = l;
    }
    
    import QtQuick 2.15
    import QtQuick.Window 2.15
    import QtQuick.Controls 2.15
    
    import com.org.myclass 1.0
    
    Window {
        width: 640
        height: 480
        visible: true
        title: qsTr("Hello World")
    
        MyClass{
            id: myClass
        }
    
        Component.onCompleted : {
            print("data : " , myClass.arr)
            print("length : " , myClass.length)
        }
    
    }
    

     

     

    • پسندیدن 1

  6. در 39 دقیقه قبل، Ali71321 گفته است :

    سلام مهندس

    من کتابخانه boost  و بیلد کردم الان چطوری کامپایلش کنم تا بتونم به کیوت اضافه اش کنم؟

    سلام،

    اگه بیلد کردی یعنی کامپلیلش کردی و کافیه به پروژه اضافش کنی.

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

    البته از ابزار‌هایی مثل conan، brew، vcpkg هم می‌تونید برای نصب این نوع کتابخانه‌ها استفاده کنید.


  7. در 12 دقیقه قبل، zahra گفته است :

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

    
    ساده ترین کار برای ارسال داده های QByteArray به qml چه روشی هست؟  آیا نمونه کدی هست که من بتونم ازش ایده بگیرم؟
    

    در پاسخ قبلی به این لینک اشاره کردم : https://doc.qt.io/qt-5/qtqml-cppintegration-topic.html نمونه کد‌های مشخصی داره، کافیه کلاس رو از نوع QObject مشتق کنید و سپس به یکی از روش‌های موجود، تابع خودتون رو پیاده سازی کرده و در نهایت برای QML رجیسترش کنید. برای مثال می‌تونید از روش‌های qmlRegisterType و rootContext استفاده کنید که روش‌های متفاوتی هستند.

    همچنین این مستندات رو می‌تونید بررسی کنید : https://doc.qt.io/qt-5/qtqml-cppintegration-exposecppattributes.html


  8. در 1 دقیقه قبل، zahra گفته است :

    سلام 

    چطوری می تونم یک فایل باینری رو در qt  بخونم و داده هاش رو به صورت یک آرایه در qml  نمایش بدم؟

    ممنون

    سلام،

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

    برای کار با باینری در مورد کلاس‌های QFile و QDataStream تحقیق کنید.

    در مورد نحوهٔ نمایش دادن هم باید کلاس‌های سمت ++C را در قالب مشتق شدهٔ QObject و در صورت نیاز به یک سری ویژگی‌های انتزاعی تحتِ یک سری کلاس‌های دیگر پیاده‌سازی کنید.

    نمونه مستندات.

    بهتر بود مثالی می‌زدین و کدی که نوشتین رو ارائه می‌کردین تا بررسی و راهکار مناسبی ارائه بشه.


  9. سلام،
    در کیوت سعی کنید از مکانیزم سیگنال و اسلات (Signal/Slot) برای این کار پیروی کنید، تابع یا توابع شما می‌توانند از این مکانیزم برای اجرا بر اساس درخواست به کار گرفته شوند. برای مثال صدا زده شدن یک شیء یا اجرا شدن آن در مقابل یک درخواست یا سیگنالِ مشخص تحتِ این مکانیزم بسیار کاربری است. هرچند نوع عملکرد تابع شما نیز در عملکرد آن موثر خواهد بود.

    public slots:
        void showProccessing();
        void hideProccessing();
    
    private signals:
        void statusChanged();

     


  10. در 41 دقیقه قبل، majid jaberi گفته است :

    سلام .بنده میخواستم از طریق بخش Application Output به برنامه ورودی بدم ولی متاسفانه ورودی قبول نمیکنه .باید چیکار کنم؟؟

    درود،

    در فایل pro. کد زیر رو اضافه کنید.

    CONFIG += console

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

    ممکنه که بعضی اوقات نیاز باشه تنظیمات را بررسی کنید، در این صورت به بخش تنظیمات و گزینهٔ Build & Run بروید و از زبانهٔ General گزینهٔ Default in tun terminal را فعال کنید. 

    • پسندیدن 1

  11. همانطور که می‌دانید در زبان‌های برنامه‌نویسی از نوع کامپایلری، گزینه‌ها و تنظیماتی وجود دارند که به شما امکان این را می‌دهد تا رفتار کامپایلر (هم‌گردان) را تا حدی سفارشی سازی کنید. این امکان به کمک تنظیمات پرچم‌ها (فلگ‌ها) و برخی از گزینه‌ها قابل انجام است و انتخاب پرچم‌های مناسب برای کامپایلر می‌تواند مورد توجه قرار بگیرد.

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

     

    در مثال زیر، نسخهٔ کامپایلر همراه با اطلاعات مربوط به آن، توسط گزینهٔ option در خط فرمان قابل دریافت است:

    gcc --version

    خروجی مربوطه می‌تواند نسبت به نسخهٔ کامپایلر به صورت زیر باشد:

    gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
    Copyright (C) 2019 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

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

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

    • تولید کد
    • بهینه‌سازی
    • فایل خروجی (نوع، نام، مکان)
    • خواص پیوند‌-دهنده
    • اندازه فایل اجرائی
    • سرعت اجرایی

    اینکه نیاز باشد کدی را بهینه‌سازی کنید، و یا مسائلی را برای دیگران گوشزد کنید کاملاً سلیقه‌‌ای است و شما در روند توسعهٔ حرفه‌ای خود می‌توانید از این تکنیک استفاده کنید.

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

    برای مثال، پرچم std نسخه یا استاندارد ایزو از سی‌پلاس‌پلاس را کامپایلر‌های رایجی مانند Clang و GCC مشخص می‌کند که به صورت زیر تعریف می‌شوند:

    • -std=c++11 (ISO C++11)
    • -std=c++14 (ISO C++14)
    • -std=c++1z (ISO C++17)
    • -std=c++20 (C++20 experimental)
    • -std=gnu++ (ISO C++ with GNU extensions)

    معادل پرچم استاندارد در کامپایلر MSVC به صورت زیر است:

    • /std:c++14
    • /std:c++17
    • /std:c++latest
    • /std:c11 /std:c17

    نکته، گزینهٔ /std از نسخهٔ ۲۰۱۷ به بعد از کامپایلر مایکروسافت در دسترس است. به صورت پیش‌فرض در این نسخه از کامپایلر این گزینه بر روی استاندارد ۱۴ تنظیم شده است. در صورت نیاز به ارتقاء آن به نسخهٔ ۱۷ طبق نمونه عمل کنید. همچنین طبق قوائد مایکروسافت استاندارد نهایی شده از آخرین ویژگی‌ها در کامپایلر تحت /std:c++latest قابل دسترس می‌باشد که در این لحظه شامل استاندارد ۲۰ می‌شود.

    گزینهٔ Verbosity به عنوان اِسم یا Verbose از نوعِ صِفَت به معنای دراز‌نویسی (بهتر است به معنای ارائه‌‌کنندهٔ اطلاعات بیشتر به آن توجه شود)، با کاراکتر W که به عنوان مخففی از Warning محسوب می‌شود قابل تنظیم است.

    بنابراین، پرچم‌های زیر برای اهداف مشخصی در نظر گرفته می‌شوند که توضیحات هر یک را در مقابل آن آورده‌ایم:

    پرچم -Wall با فعال شدن، تعداد زیادی از پرچم‌های هشدار دهندهٔ کامپایلر را به طور خاص و باهم روشن می‌کند که لیست آن به صورت زیر است:

    • -Waddress
    • -Warray-bounds=1 (only with -O2)  
    • -Warray-parameter=2 (C and Objective-C only) 
    • -Wbool-compare
    • -Wbool-operation
    • -Wc++11-compat  -Wc++14-compat
    • -Wcatch-value (C++ and Objective-C++ only)  
    • -Wchar-subscripts
    • -Wcomment
    • -Wduplicate-decl-specifier (C and Objective-C only) 
    • -Wenum-compare (in C/ObjC; this is on by default in C++) 
    • -Wenum-conversion in C/ObjC; 
    • -Wformat   
    • -Wformat-overflow  
    • -Wformat-truncation
    • -Wint-in-bool-context
    • -Wimplicit (C and Objective-C only) 
    • -Wimplicit-int (C and Objective-C only) 
    • -Wimplicit-function-declaration (C and Objective-C only) 
    • -Winit-self (only for C++) 
    • -Wlogical-not-parentheses 
    • -Wmain (only for C/ObjC and unless -ffreestanding)  
    • -Wmaybe-uninitialized
    • -Wmemset-elt-size
    • -Wmemset-transposed-args
    • -Wmisleading-indentation (only for C/C++) 
    • -Wmissing-attributes
    • -Wmissing-braces (only for C/ObjC) 
    • -Wmultistatement-macros  
    • -Wnarrowing (only for C++)  
    • -Wnonnull
    • -Wnonnull-compare
    • -Wopenmp-simd
    • -Wparentheses
    • -Wpessimizing-move (only for C++)  
    • -Wpointer-sign
    • -Wrange-loop-construct (only for C++)  
    • -Wreorder
    • -Wrestrict
    • -Wreturn-type
    • -Wsequence-point
    • -Wsign-compare (only in C++)  
    • -Wsizeof-pointer-div
    • -Wsizeof-pointer-memaccess
    • -Wstrict-aliasing
    • -Wstrict-overflow=1
    • -Wswitch
    • -Wtautological-compare
    • -Wtrigraphs
    • -Wuninitialized
    • -Wunknown-pragmas
    • -Wunused-function
    • -Wunused-label
    • -Wunused-value
    • -Wunused-variable
    • -Wvla-parameter (C and Objective-C only) 
    • -Wvolatile-register-var
    • -Wzero-length-bounds

    برای مثال، با فعال‌سازی پرچم -Werror، هرگونه هشدار را به خطای تلفیقی تبدیل می‌کند. این کار باعث می‌شود خطاهای مربوط به کد‌های خطرناک را به گونه‌ای جلوه دهید که از کامپایل آن‌ها جلو‌گیری شود. کار‌های مشابه این مورد، به صورت پیش‌فرض در زبان‌های مانند Rust انجام می‌شود که از کد‌های دارای خطا و خطرناک برای کامپایل جلوگیری می‌کند. به کار گیری چنین پرچم‌هایی در کامپایلر سی++ می‌تواند خطاهای شامل هشدار رو به خطاهای غیر قابل کامپایل تبدیل کند.

    جهت تنظیم این پرچم در پروژهٔ خود کافی است در ابزار ساخت مورد نظر آن را اعمال کنید، به عنوان مثال در سی‌میک (CMake) به صورت زیر عمل کنید:

    SET (CMAKE_CXX_FLAGS "-Werror")

    و یا در QMake به شیوهٔ زیر می‌توانید این ویژگی را فعال کنید:

    QMAKE_CXXFLAGS += -Werror

    برای مثال، کد زیر در صورت فعال بودن این پرچم، کامپایل نخواهد شد.

    int myFunction() {
      //‌no return!
    }
    
    auto main() -> int {
        
        return 0;
    }

    خروجی این پیام به صورت زیر خواهد بود:

    error: no return statement in function returning non-void [-Werror=return-type]

    به معنای این ‌که هیچ بیانیه‌ای به عنوان عبارت بازگشتی در تابع مربوطه که از نوع غیر-باطل (non-void) است، وجود ندارد.

    بسیاری از این گزینه‌ها برای هدف خاصی در نظر گرفته می‌شوند که می‌توانید جزئیات بیشتر آن را در این لینک پیدا کنید.

    برخی از پرچم‌های رایج برای کتابخانه‌ها

    • گزینهٔ پرچم -lm امکان کامپایل کتابخانه‌های libm نوع سوم را به همراه کتابخانه‌های ریاضیاتی که عموماً به زبان سی هستند را می‌دهد.
    • گزینهٔ پرچم -lpthread امکان کامپایل کتابخانه‌های مشترک از استاندارد پازیکس (Posix) را ارائه می‌کند.
    • گزینهٔ پرچم -lstdc++fs امکان کامپایل و لینک شدن به کتابخانهٔ فایل‌سیستم را در استاندارد ۱۷ به بعد می‌دهد.

    پرچم‌های بهینه‌سازی تحت کامپایلر‌

    1. با فعال‌سازی و اعمال پرچم-O0 هیچ گونه بهینه‌سازی بر روی کد‌ها انجام نمی‌شود، در اصل امکان بهینه‌سازی کاملاً غیرفعال می‌شود. زمان کامپایل و همگردانی کد‌ها سریع‌تر می‌شود و برای ابزار‌های اشکال‌زدائی بهترین عملکرد را دارد.
    2. با فعال‌سازی و اعمال پرچم-O2 سطح بالا‌تری از بهینه‌سازی صورت می‌گیرد، ترکیبی از حالت بهینه‌سازی و سطح قبلی را اعمال می‌کند و طبیعتاً زمان بیشتری صرف کامپایل می‌شود و گزینهٔ بهتری برای ساخت یک محصول بهتر است.
    3. با فعال‌سازی و اعمال پرچم-O3 سطح بالا‌تری نسبت به سطح دوم از بهینه‌سازی صورت می‌گیرد، طبیعتاً زمان بیشتری صرف کامپایل می‌شود و گزینهٔ بهتری برای ساخت یک محصول بهتر است. از طرفی حجم باینری بیشتری را تولید کرده و زمان کامپایل طولانی‌تری را تحمیل می‌کند.
    4. با فعال‌سازی و اعمال پرچم-OFast سطح بالا‌تری نسبت به سطح سوم از بهینه‌سازی صورت می‌گیرد، طبیعتاً زمان بیشتری صرف کامپایل می‌شود و گزینهٔ بسیار بیشتری مانند -ffloat-store, -ffsast-math, -ffinite-math-only, -O3 را فعال می‌کند و برای ساخت یک محصول بهتر است.
    5. با فعال‌سازی و اعمال پرچم -OS امکان سطح دوم از بهینه‌سازی فعال می‌شود، با تفاوت اینکه برخی از پرچم‌ها با هدف کاهش اندازهٔ فایل کدِ شیء (object-code) غیرفعال می‌‌شوند.
    6. با فعال‌سازی و اعمال پرچم-Oz سطح بالا‌تری نسبت به سطح -OS برای کاهش اندازهٔ فایل صورت می‌گیرد. این گزینه مختصِ Clang است.

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

    دقت کنید که نوع پرچم‌ها نسبت به کامپایلر‌ها متفاوت است، برای مثال پرچم -Od به معنای غیر‌فعال‌سازی تمامی بهینه‌سازی‌ها و جمع‌آوری و کامپایل سریع کد‌ها و در نهایت اشکال‌زدائی بهتر است که در Clang و MSVC پشتیبانی می‌شود و یا پرچمِ -OS صرفاً بر روی کامپایلر کلنگ قابل استفاده است.

    نقل قول

    این مقاله به‌روز و به مرور زمان کامل‌تر خواهد شد.

     

    • پسندیدن 1

  12. در این مقاله نیاز است بدانید که، کتابخانهٔ توابع ویژه ریاضی در اصل بخشی از کتابخانه TR1 ISO / IEC TR 19768: 2007 بود، سپس به عنوان یک استاندارد ISO مستقل، ISO / IEC 29124: 2010 منتشر شد و در نهایت از C++ 17 به استاندارد ایزو ادغام شد.

    برای استفاده از توابع ریاضیاتی مانند هرمیتی، بسل و غیره کافی است فایل سرآیند <cmath> را فراخوانی کنید.

    به عنوان مثال توابع چند‌جمله‌ای لگر به صورت زیر می‌توانند مورد استفاده قرار گیرند:

    #include <cmath>
    #include <iostream>
    
    double L1(unsigned m, double x) { return -x + m + 1; }
    double L2(unsigned m, double x) { return 0.5*(x*x-2*(m+2)*x+(m+1)*(m+2)); }
    
    int main()
    {
        // spot-checks
        std::cout << std::assoc_laguerre(1, 10, 0.5) << '=' << L1(10, 0.5) << '\n'
                  << std::assoc_laguerre(2, 10, 0.5) << '=' << L2(10, 0.5) << '\n';
    }

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

    #include <cmath>
    #include <iostream>
    double P20(double x) { return 0.5*(3*x*x-1); }
    double P21(double x) { return 3.0*x*std::sqrt(1-x*x); }
    double P22(double x) { return 3*(1-x*x); }
    int main()
    {
        // spot-checks
        std::cout << std::assoc_legendre(2, 0, 0.5) << '=' << P20(0.5) << '\n'
                  << std::assoc_legendre(2, 1, 0.5) << '=' << P21(0.5) << '\n'
                  << std::assoc_legendre(2, 2, 0.5) << '=' << P22(0.5) << '\n';
    }

    نحوهٔ استفاده از توابع بتا 72079677c102d13255997ca503995071751bc415

    #include <cmath>
    #include <string>
    #include <iostream>
    #include <iomanip>
    
    double binom(int n, int k) { return 1/((n+1)*std::beta(n-k+1,k+1)); }
    
    int main()
    {
        std::cout << "Pascal's triangle:\n";
        for(int n = 1; n < 10; ++n) {
            std::cout << std::string(20-n*2, ' ');
            for(int k = 1; k < n; ++k)
                std::cout << std::setw(3) << binom(n,k) << ' ';
            std::cout << '\n';
        }
    }

    اطلاعات بیشتر از این تابع، در این لینک.

    نحوهٔ استفاده از توابع انتگرال بیضوی نوع اول 8c44bc76409dc7c70cedbd000891b672bede1487 :

    #include <cmath>
    #include <iostream>
    
    int main()
    {
        double hpi = std::acos(-1)/2;
    
        std::cout << "K(0) = " << std::comp_ellint_1(0) << '\n'
                  << "π/2 = " << hpi << '\n'
                  << "K(0.5) = " << std::comp_ellint_1(0.5) << '\n'
                  << "F(0.5, π/2) = " << std::ellint_1(0.5, hpi) << '\n';
        std::cout << "Period of a pendulum length 1 m at 90° initial angle is "
                  << 4*std::sqrt(1/9.80665)*
                     std::comp_ellint_1(std::pow(std::sin(hpi/2),2)) << " s\n";
    }

    اطلاعات بیشتر از این تابع، در این لینک.

    نحوهٔ استفاده از توابع انتگرال بیضوی نوع دوم f1bcc3ab6912f07c1fefa24902e3c7b793b886fb :

    #include <cmath>
    #include <iostream>
    
    int main()
    {
        double hpi = std::acos(-1)/2;
    
        std::cout << "E(0) = " << std::comp_ellint_2(0) << '\n'
                  << "π/2 = " << hpi << '\n'
                  << "E(1) = " << std::comp_ellint_2(1) << '\n'
                  << "E(1, π/2) = " << std::ellint_2(1, hpi) << '\n';
    }

    اطلاعات بیشتر از این تابع، در این لینک.

    نحوهٔ استفاده از توابع انتگرال بیضوی نوع سوم 50b0c46b333ed1f25110f8fbfcf6d01ee7275277 :

    #include <cmath>
    #include <iostream>
    
    int main()
    {
        std::cout << std::fixed
                  << "Π(0.5,0) = " << std::comp_ellint_3(0.5, 0) << '\n'
                  << "K(0.5)   = " << std::comp_ellint_1(0.5) << '\n'
                  << "Π(0,0)   = " << std::comp_ellint_3(0, 0) << '\n'
                  << "π/2      = " << std::acos(-1)/2 << '\n'
                  << "Π(0.5,1) = " << std::comp_ellint_3(0.5, 1) << '\n';
    }

    اطلاعات بیشتر از این تابع، در این لینک.

    نحوهٔ استفاده از توابع بسل نوع اول ed47616b50abbef012a9a4e0069b50d4894ac320 :

    #include <cmath>
    #include <iostream>
    
    int main()
    {
        // spot check for ν == 0
        double x = 1.2345;
        std::cout << "I_0(" << x << ") = " << std::cyl_bessel_i(0, x) << '\n';
     
        // series expansion for I_0
        double fct = 1;
        double sum = 0;
        for(int k = 0; k < 5; fct*=++k) {
            sum += std::pow((x/2),2*k) / std::pow(fct,2);
            std::cout << "sum = " << sum << '\n';
        }        
    }

    اطلاعات بیشتر از این تابع، در این لینک.

    نحوهٔ استفاده از توابع بسل نوع دوم ff32812f22090cd5898d99213a194f53c511387c :

    #include <cmath>
    #include <iostream>
    
    int main()
    {
        // spot check for ν == 0
        double x = 1.2345;
        std::cout << "J_0(" << x << ") = " << std::cyl_bessel_j(0, x) << '\n';
     
        // series expansion for J_0
        double fct = 1;
        double sum = 0;
        for(int k = 0; k < 6; fct*=++k) {
            sum += std::pow(-1, k)*std::pow((x/2),2*k) / std::pow(fct,2);
            std::cout << "sum = " << sum << '\n';
        }        
    }

    اطلاعات بیشتر از این تابع، در این لینک.

    همچنین در مورد توابع دیگر مانند هرمیتی و غیره می‌توانید از مرجع آن استفاده کنید.


  13. جزئیات در ۱۱ ++C و برخی بهبود‌ها در ویرایش ۱۷

    جدا کننده رقم استاندارد ۱۱

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

    int no = 1'000'000;
    long addr = 0xA000'EFFF;
    uint32_t binary = 0b0001'0010'0111'1111;

    تعریف نام مستعار (Type aliases) استاندارد ۱۱

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

    template <typename T>
    using dynamicArray = std::vector<T>;
    dynamicArray<int> nums; // equivalent to std::vector<int>
    using func_ptr = int (*)(int);
    

    و یا اگر بخواهید نام مستعاری از یک نوع std::map با کلید و مقدار از نوع رشته تعریف کنید، آنگاه به صورت زیر خواهد بود:

    using mapString  = std::map<std::string, std::string>;
    

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

    // C++11
    using counter = long;
    
    // C++03 equivalent:
    // typedef long counter;
    
    // C++11
    using fmtfl = std::ios_base::fmtflags;
    
    // C++03 equivalent:
    // typedef std::ios_base::fmtflags fmtfl;
    
    fmtfl fl_orig = std::cout.flags();
    fmtfl fl_hex = (fl_orig & ~std::cout.basefield) | std::cout.showbase | std::cout.hex;
    // ...
    std::cout.flags(fl_hex);
    
    // C++11
    using func = void(*)(int);
    
    // C++03 equivalent:
    // typedef void (*func)(int);
    
    // func can be assigned to a function pointer value
    void actual_function(int arg) { /* some code */ }
    func fptr = &actual_function;
    
    template<typename T> using ptr = T*;
    
    // the name 'ptr<T>' is now an alias for pointer to T
    ptr<int> ptr_int;

    الفاظ رشته‌ای تعریف شده توسط کاربر (User-defined literals) استاندارد ۱۱

    • در مواقع نیاز شما مجبورید با اصطلاحات واضحی مثل MB, KB, GB یا km، cm و یا واحد‌های دیگری جهت تبدیلات در زمان اجرا کار‌ی انجام دهید. اکنون به عنوان کاربر می‌توانید اصلاح مورد نیاز خود را همانند انواع pt (انواع ابتدائی) دیگر انجام دهید.
    • این شیوه برای واحد‌ها و اندازه‌گیری بسیار مناسب است.
    • اضافه کردن constexpr اثر هزینهٔ صفر از کارایی را در زمان اجرا فراهم می‌کند.
    using ull = unsigned long long;
    
    constexpr ull operator"" _KB(ull no)
    {
        return no * 1024;
    }
    constexpr ull operator"" _MB(ull no)
    {
        return no * (1024_KB);
    }
    
    int main()
    {
      
      std::cout << 1_KB << std::endl;
      std::cout << 1_MB << std::endl;
      
      return 0;
    }

    ویژگی مقداردهی لیست اولیه (std::initializer_list) استاندارد ۱۱

    std::pair<int, int> p = {1, 2};
    std::tuple<int, int> t = {1, 2};
    std::vector<int> v = {1, 2, 3, 4, 5};
    std::set<int> s = {1, 2, 3, 4, 5};
    std::list<int> l = {1, 2, 3, 4, 5};
    std::deque<int> d = {1, 2, 3, 4, 5};
    std::array<int, 5> a = {1, 2, 3, 4, 5};

    این شیوه مشابه آرایه‌ها به سبک C مقادیر را مستقیماً با لیست مقدار دهندهٔ اولیه «std::initializer_list» اختصاص می‌دهد. همچنین به لطف استاندارد ۱۱ این مورد در مورد نگه‌دارنده‌های تو در تو هم صدق می‌کند.

     

    ویژگی auto و decltype استاندارد ۱۱، بهبود و اضافات در استاندارد ۲۰

    • متغیر‌های تعریف شده به وسیلهٔ کلمهٔ کلیدی auto بر اساس نوع مقدار توسط کامپایلر استنباط می‌شوند.
    • متغیر‌های تعرف شده به کمک کلمهٔ کلیدی decltype بر اساس بررسی موجودیت یا نوع و مقادیر عبارت تعیین می‌شوند.
    • این ویژگی‌ها به شدت برای خواندن، به ویژه انواع پیچیده مفید است.
    auto a = 3.14; // double

    اجازه دهید یک مثال با ترکیب auto و decltype داشته باشیم.

    به عنوان مثال، توابع می‌توانند به وسیلهٔ کلمهٔ کلیدی auto نیز نوع بازگشتی خود را استنباط کنند. در استاندارد ۱۱ نوع بازگشتی باید به طور صریح یا با استفاده از نوع decltype رمزگشایی شود، به مثال‌های عادی و الگو (template) مانند زیر توجه کنید:

    auto getResult(std::string var) -> decltype (var) {
      return var;
    }
    template <typename X, typename Y>
    auto add(X x, Y y) -> decltype(x + y)
    {
        return x + y;
    }
    add(1, 2);     // == 3
    add(1, 2.0);   // == 3.0
    add(1.5, 1.5); // == 3.0

    ویژگی Range-based for-loops استاندارد ۱۱ به علاوهٔ اضافات و بهبود‌ها در استاندارد ۱۷ و ۲۰

    یک نحوِ شیرین برای تکرار عناصر در یک نگه‌دارنده یا ظرف (container)

    std::vector<int> v = {0, 1, 2, 3, 4, 5};
    for (const int& i : v) // access by const reference
      std::cout << i << ' ';
      std::cout << '\n';

    برای بررسی برخی از ویژگی‌های مرتبط با این موضوع به مقالات زیر مراجعه کنید:

     

    اشاره‌گر‌های هوشمند استاندارد ۱۱، بهبود‌ها در استاندارد ۱۷

    استاندارد ۱۱ با خود اشاره‌گر‌های هوشمند را معرفی کرده است مانند std::unique_ptr، std::shared_ptr و std::weak_ptr که سپس std::auto_ptr در استاندارد ۱۷ به عنوان منسوخ شده معرفی و حذف شده است.

    std::unique_ptr<int> p = std::make_unique<int>(128);

     برای آشنایی با این ویژگی، لازم است در رابطه با اصطلاح RAII آشنا شوید، برای این منظور مقالهٔ زیر را برای مطالعه پیشنهاد می‌کنم.

     

     

    صفت‌های استاندارد جدید مانند، [[fallthrough]]، [[maybe_unused]] و [[nodiscard]] استاندارد ۱۷

    این بحث به خودی خود بسیار جذاب است، بنابراین برای آن یک مقالهٔ ویژه در نظر گرفته‌ام که در ادامه می‌توانید به آن مراجعه کنید.

     

    ویژگی فضاهای نام تو در تو (Nested namespace) استاندارد ۱۷

    فضاهای نام یکی از کاربردی‌ترین ویژگی‌های سی++ از زمان استاندارد ۱۱ به بعد می‌باشد که نحوهٔ تعریف آن به صورت زیر است:

    namespace Base {
      namespace Person {
        class PersonInfo {
        public:
          std::string name = {"Kambiz"};
        };
      }
    }

    در ادامهٔ استاندارد ۱۷ بهبود آن به شیوهٔ تو در تو صورت گرفته است و می‌تواند به صورت زیر تعریف شود:

    namespace Base::Person {
        class PersonInfo {
        public:
          std::string name = {"Kambiz"};
        };
    }

    در نهایت دسترسی به فضای نام و اعضای آن به همان شیوهٔ ساده ممکن است:

    Base::Person::PersonInfo pInfo;
      std::cout << pInfo.name << std::endl;

     

    یک کاراکتر u8 لفظی استاندارد ۱۷

    این ویژگی برای ترجمهٔ صحیح کاراکتر‌ها به اسکی (ASCII) در پلتفرم‌های مختلف استفاده می‌شود.

    auto c = {u8'C'};

    و یا به صورت یک رشتهٔ کامل:

    auto str = u8"سلام";
      std::cout << str << "/n";

     

    امکان استفاده از auto در template  استاندارد ۱۷

    این ویژگی امکان این را می‌دهد تا نوع پارامتر‌ها را در الگو‌ها تعریف کنیم، در استاندارد ۱۴ این ویژگی به صورت زیر ممکن است:

    template<typename Type, Type x> constexpr auto value = x;
    int main()
    {   
       auto x = value<int,3>;
       return 0;
    }

    و اینک به لطف استاندارد ۱۷ استفاده از کلمهٔ کلیدی auto نیز فراهم شده است که به طور زیر تعریف می‌شود:

    template<auto x> constexpr auto value = x;
     
    int main()
    {   
       auto x = value<3>;
     
       return 0;
    }

    نوع متغیر x توسط کامپایلر استنباط می‌شود، البته باید در نظر داشت این ویژگی در استفاده از variadic templates هم کاربرد دارد. به مثال زیر توجه کنید:

    template<auto ... values> struct A {};
     
    int main()
    {   
       auto k = A<1, 2, 'c'>();
       return 0;
    }

    الفاظ رشته‌ای (لیترال) با ممیز شناور‌ (Floating point) در مبنای هگزادسیمال استاندارد ۱۷

    در استاندارد ۱۷ ممیز شناور در مبنای هگزادسیمال اضافه شده است. اگر یک حرف شناور لفظی، آغازش با دنبالهٔ کاراکتر‌های 0x یا 0X باشد، آن در مبنای هگزا دسیمال شناور محسوب می‌شود. در غیر این صورت در مبنای شناور دسیمال (مبنای ۱۰) تعریف می‌شود.

    0x | 0X hex-digit-sequence exponent suffix
    double d = 0x1.2p3; // hex fraction 1.2 (decimal 1.125) scaled by 2^3, that is 9.0

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

    #include <iostream>
    int main()
    {
      std::cout << 58.         << '\n'
                << 4e2         << '\n'
                << 123.456e-67 << '\n'
                << .1E4f       << '\n'
                << 0x10.1p0    << '\n';
    }

    نتیجهٔ تحت این ویژگی به این صورت است:

    58
    400
    1.23456e-65
    1000
    16.0625

     

    • پسندیدن 1

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

    در این بخش من قصد دارم در رابطه با برخی از پرکاربرد‌ترین متغیر‌های CMake اشاره‌ای داشته باشم.

    بنابراین متغیر‌های زیر را در نظر بگیرید:

    • متغیر UNIX: تمامی سیستم‌عامل‌های شبه‌-یونیکس مانند macOS را شامل می‌شود. درواقع زمانی true است که پلتفرم آن مک یا شبه‌-یونیکس باشد.
    • متغیر WIN32: زمانی true خواهد بود که پلتفرم مقصد و توسعه ویندوز باشد.
    • متغیر MINGW: پلتفرم ویندوز را بر پایهٔ MinGW شامل می‌شود و زمانی true خواهد بود که پلتفرم ویندوز همراه با کامپایلر Mingw پیکربندی شده باشد.
    • متغیر MSVC: زمانی برابر true خواهد بود که پلتفرم ویندوز همراه با کامپایلر MSVC پیکربندی شده باشد.

    برای مثال اگر بخواهیم کاری انجام دهیم که صرفاً در پلتفرم ویندوز اعمال شود، باید آن را در دامنهٔ چنین شرطی قرار دهیم:

    if(WIN32)
        # for Windows operating system in general
    endif()

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

    مثال برای شناسایی محصولات شرکت اپل، تحتِ سیستم‌عامل‌های macOS، iOS و حتی watchOS , tvOS

    if(APPLE)
        # for MacOS X or iOS, watchOS, tvOS (since 3.10.3)
    endif()

    مثال برای بررسی نوع سیستم‌عامل‌های یونیکس و لینوکس به غیر از محصولات اپل

    if(UNIX AND NOT APPLE)
        # for Linux, BSD, Solaris, Minix
    endif()

    یک شرط نسبتاً کامل‌تر به صورت زیر خواهد بود:

    if(APPLE)
        # for MacOS X or iOS, watchOS, tvOS (since 3.10.3)
         MESSAGE("Current platform is macOS!")
    elseif(Linux AND NOT APPLE)
        # for Linux and not Unix base such as macOS!
        MESSAGE("Current platform is Linux!")
    elseif(WIN32)
        # for Windows only!
        MESSAGE("Current platform is Windows!")
    elseif(UNIX AND NOT APPLE)
        # for Linux, Unix base Free-BSD, Solaris, Minix
        MESSAGE("Current platform is Unix!")
    elseif(ANDROID)
        # for Linux base, Android only!
        MESSAGE("Current platform is Android!")
    endif()

    مثال برای تشخیص بر اساس نوع کامپایلر، مختص پلتفرم ویندوز تحت Mingw، MSys و MSVC

    if(MSVC OR MSYS OR MINGW)
        # for detecting Windows compilers
    endif()

    روش‌های دیگری نیز برای مقایسه صریح دیگری وجود دارد، برای مثال عملگر STREQUAL می‌تواند گزینهٔ خوبی در تشخیص و اعمال شرط باشد.

    مثل مقایسه‌ای، در صورتی که نوع کامپایلر Clang باشد یا گزینه‌های دیگر:

    if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
      # using Clang
    elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
      # using GCC
    elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
      # using Intel C++
    elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
      # using Visual Studio C++
    endif()

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

    همچنین می‌توان از عملگر MATCHES در بررسی شرط استفاده کرد:

    if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
      MESSAGE("MSVC")
    endif()

    این مقاله ادامه خواهد داشت...

    • هاها! 1

  15. با سلام و درود،

    نسخهٔ ۵.۱۵.۰ به عنوان یک نسخهٔ نهایی از سری کیوت ۵ همراه با ویژگی‌های بسیاری ارائه شد. این نسخه با هدف پشتیبانی کامل از ویژگیِ backward-compatible (پشتیبانی از عقب‌گرد) در نسخه‌های سری ۵ منتشر شده است. اما طبق شرایطی که اخیراً شرکت کیوت اعلام کرده است، این نسخه به دو روش پشتیبانی بلند‌مدت و عادی ارائه می‌شود.

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

    Screen Shot 2020-05-26 at 8.35.24 PM-min.png

    این نسخه شامل ویژگی‌ها و اصلاحیه‌های زیر می‌باشد:

    1. پشتیبانی از ویژگی‌های نسخه‌های قبلی تا قبل از نسخهٔ سری ۶.
    2. پشتیبانی از رابط‌های بک‌اندی ۳ بعدی و رندرینگ که می‌توان یکی از تغییرات بسیار مهم سری کیوت ۵ باشد که در ادامه به آن اشاره شده است.
    3. ماژول کیوت کوئیک ۳ بعدی (Qt Quick 3D)
    4. محیط Qt Design Studio ۱.۵
    5. بهبود‌ها و تغییرات در ماژول Qt QML
    6. بهبود‌ها و تغییرات در ماژول Qt Quick
    7. و دیگر تغییرات و بهبود‌ها...

    پشتیبانی از ویژگی‌های نسخه‌های قبلی تا قبل از نسخهٔ سری ۶

    کیوت ۵.۱۵ به عنوان یک پله به سمت کیوت ۶ می‌باشد. این در صورتی است که کیوت ۶ در حال تغییر و تحولات بسیاری خواهد بود که در این نسخه از کیوت ۵.۱۵ سعی بر آن شده است که آن را به آسانی ممکن سازد. بسیاری از عملکرد‌هایی مستهلک که نشانه‌گذاری شده‌اند در کیوت ۶ حذف خواهند شد. با توجه به این موارد، کیوت ۵.۱۵ هم به عنوان یک نسخهٔ کامل از سری ۵ و هم یک پیش شروعی از نسخهٔ سری ۶ محسوب خواهد شد.

    پشتیبانی از رابط‌های بک‌اندی ۳ بعدی و رندرینگ

    احتمالاً مهمترین تغییر در سمت گرافیک و موتور رندرینگ کیوت اتفاق افتاده است. تغییرات بسیاری در لایه‌های زیرین اتفاق می‌افتد که بلافاصله برای کاربران قابل مشاهده نیست. در سال گذشته کار بر روی پشتهٔ گرافیکی صورت گرفت که این به‌روز رسانی در کیوت سری ۶ متمرکز خواهد شد که در حال حاضر نیز در کیوت ۵.۱۵ به عنوان گزینه‌ای در دسترس است.

    تیم توسعهٔ کیوت پشته‌های گرافیکی را در کیوت ۵ به خوبی توسعه داده بود تا به صورت چند-سکویی از این رابط‌های گرافیکی سه بعدی استفاده شود. اما طی دو سال اخیر، تغییرات قابل توجهی در صنعت باعث شده است که توسعه و استقرار برنامه‌هایی که از گرافیک‌های سه بعدی استفاده می‌کنند پیچیده‌تر شود. از طرفی اول شروع به کار روی Metal کرد و مدتی پیش پشتیبانی از OpenGL را در macOS و iOS کاهش و منسوخ کرد. گروه Khronos تلاش کرده است تا OpenGL را با Vulkan جایگزین کند که راهی برای اندروید و لینوکس می‌سازد. از طرف دیگر رابط‌های Direct3D 12 مایکروسافت کاملاً بازنویسی شده‌ است و به هیچ وجه با نسخه‌های قدیمی آن سازگار نیست. البته این به این معنی نیست که OpenGL در آینده از بین می‌رود.

    با توجه به شعار و قول کیوت با عنوان «چند-سکویی» توسعه‌دهندگان کیوت به دنبال راه حلی هستند که این راه حل در همه جا کار کند. بنابراین برای رسیدن به این هدف، کمی بیشتر از یک سال پیش شروع به کار بر روی یک لایهٔ انتزاعی برای همهٔ آن‌ها تحت Api‌های مختلف کرده‌اند. این رابط سخت‌افزاری Qt Rendering Hardware Interface یا RHI نام دارد و می‌تواند برای اجرای برنامه‌های تحت فناوری کیوت کوئیک (Qt Quick) در بالای Metal، Direct3D و Vulkan و همچنین OpenGL استفاده شود. به عنوان یک پیش‌نمایش فناوری در کیوت ۵.۱۵ پشتیبانی می‌شود، در واقع می‌توانید با فعال‌سازی آن از طریق یک متغیر محیطی، از Qt RHI استفاده کنید. در نهایت در کیوت ۶ این لایه بخش بسیار مهمی از معماری کیوت را تشکیل خواهد داد.

    ماژول کیوت کوئیک ۳ بعدی (Qt Quick 3D)

    یکی دیگر از ویژگی‌های قابل توجه و جدید در کیوت ۵.۱۵ نیز مربوط به گرافیک است. در زمان آغاز کیوت سری ۵ فناوری Qt Quick را سنگ بنای معماری کیوت در نظر گرفته و معرفی شده است. تمرکز آن بر ساده‌سازی ایجاد رابط‌های کاربری ۲ بعدیِ مبتنی بر لمس بود. امروزه کیوت ۵.۱۵ با یک فناوری جدید‌تر به عنوان Qt Quick 3D نیز معرفی می‌شود، فلسفهٔ آن کاربری آسان و ادغام محتوای ۳ بعدی در برنامه‌های مبتنی بر فناوری Qt Quick می‌باشد. در واقع با استفاده از Qt Quick 3D می‌توانید به راحتی صحنه‌های سه بعدی را در QML تعریف کنید. می‌توانید نور، چراغ، مِش و مواد مورد نظر خود را در آن تعریف کرده و همه چیز را به راحتی با رابط‌های ۲ بعدی خود ترکیب کنید.

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

    محیط Qt Design Studio ۱.۵

    فناوری کیوت کوئیک ۳ بعدی تعداد زیادی از گزینه‌ها را برای ایجاد یک برنامهٔ جدید و جالب شامل عناصر ۲ بعدی و ۳ بعدی را فراهم می‌کند. بنابراین تلاش‌های بسیاری در توسعهٔ محیط Qt Design Studio شده است، تمام این قابلیت‌ها در اختیار و دسترس طراحان قرار می‌گیرد. به همین دلیل این یک نکتهٔ قوت است که بگوییم پشتیبانی از فناوری کیوت کوئیک ۳ در این نسخه از محیط استودیو طراحی کیوت ارائه می‌شود.

    بهبود‌ها و تغییرات در ماژول Qt QML

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

    بهبودی در ابزار qmllint رخ داده است و به مراتب راجع به مشکلات احتمالی در پایهٔ کد‌های QML نتیجهٔ بهتری را خواهد داشت.

    بهبود‌ها و تغییرات در ماژول Qt Quick

    چند ویژگی جدید نیز در Qt Quick ظاهر شده است. پشتیبانی از فضاهای رنگی در عنصر Image اضافه شده‌است. عنصر جدیدی به نام PathText به Qt Quick Shapes اضافه شده است. کنترل اشاره‌گر‌ها در گزینهٔ cursorShape برای مدیریت شکل مکان‌نما در سیستم‌های دسکتاپی و یک آیتم HeaderView برای افزودن آسان هدر‌های افقی یا عمدی در TableView اضافه شده است.

    دیگر بهبود‌ها

    • کاربران کیوت خوشحال خواهند شد که بدانند، اکنون می‌توانند پشتیبانی بسیار بهتری را در رابطه با ظاهر (دکوراسیون) پنجره‌های سفارشی داشته باشند که به شما این امکان را می‌دهد تا تزئینات پنجرهٔ خود را تعریف کرده و محتوای سفارشی را در فضای نوار عنوان پنجره‌ها اعمال کنید.
    • ماژول Qt Lottie، ماژولی که به عنوان یک پیش‌نمایش در نسخهٔ ۵.۱۴ معرفی شده بود، اکنون به صورت کامل پشتیبانی می‌شود. این ماژول به شما امکان می‌دهد تا از انیمیشن‌های After Effect در برنامه‌نویسی مبتنی بر کیوت استفاده کنید.
    • ماژول Qt WebEgine از کرومیوم نسخهٔ ۷۷ در ۵.۱۴ به کرومیوم ۸۰ به‌روز شده است و با تمامی ویژگی‌های جدید از به‌روز‌رسانی‌های کرومیوم همراه است.
    • ماژول Qt 3D پشتیبانی از اشکال‌زدائی و چند ویژگی جدید و کوچکتر را به همراه دارد.
    • ماژول Qt Multimedia، اکنون از چند سطح رندرینگ پشتیبانی می‌کند. در Qt GUI مقیاس‌بندی تصویر و روال تبدیل اکنون برای بسیاری از موارد چند رشته‌ای قابل استفاده است.
    • ماژول Qt Network اکنون از نسخهٔ TLS 1.3 پشتیبانی می‌کند.
    • در ماژول Qt Core، QRunnable و QThreadPool اکنون می‌توانند با std::function کار کنند و همچنین یک روش QFile::moveToTrash() برای انتقال فایل‌ها به داحل سطل زباله به صورت چند-سکویی فراهم شده است.
    • در نهایت نیز پشتیبانی از دیالوگ (پنجره‌های گفتگو) بومی در اندروید اضافه شده است و نیازی نیست کد‌های اضافی در این بخش اعمال کنید.
    • تشکر شده 1

  16. امروز نسخهٔ جدید ۴.۱۲.۰ از کیوت‌کریتور منتشر شد که دارای ویژگی‌های مهم‌تری نسبت به نسخه‌های قبلی دارد.

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

    Qt Creator 4.12
    ===============
    
    Qt Creator version 4.12 contains bug fixes and new features.
    
    The most important changes are listed in this document. For a complete
    list of changes, see the Git log for the Qt Creator sources that
    you can check out from the public Git repository. For example:
    
        git clone git://code.qt.io/qt-creator/qt-creator.git
        git log --cherry-pick --pretty=oneline origin/4.11..v4.12.0
    
    General
    -------
    
    * Added `Restart Now` option when changing settings that require restart
    * Added option for linking Qt Creator to a Qt installation, sharing
      auto-detected Qt versions and kits
    * Added guard against crashing plugins at startup, providing the option
      to temporarily disable the offending plugin
    * Added locator filter for searching in Qt Project bug tracker
    * Added option to create custom URL template locator filters
    * Added browser for Marketplace items to Welcome mode (QTCREATORBUG-23452)
    * Fixed various theming issues
    
    Help
    ----
    
    * Added tool button for changing target for context help (QTCREATORBUG-17667)
    * Added option to register documentation only for highest Qt version, and made that default
      (QTCREATORBUG-21482, QTCREATORBUG-22799, QTCREATORBUG-10004)
    
    Editing
    -------
    
    * Added `Go to Last Edit`
    * Added option for default line terminator style (QTCREATORBUG-3590)
    * Improved behavior when splitting would hide text cursor
    * Fixed that wizards ignored default file encoding
    * Fixed that only restricted number of sizes were allowed for font size (QTCREATORBUG-22536)
    * Fixed completion after undo (QTCREATORBUG-15038)
    
    ### C++
    
    * Fixed issue with Clang and precompiled headers (QTCREATORBUG-22897)
    
    ### Language Client
    
    * Added support for Markdown in tooltips
    * Added support for auto-formatting
    * Added outline dropdown (QTCREATORBUG-21916)
    * Improved protocol error reporting
    * Fixed `Ctrl-click` for `Follow Symbol Under Cursor` (QTCREATORBUG-21848)
    
    ### QML
    
    * Updated to Qt 5.15 parser (QTCREATORBUG-23591)
    * Improved support for multiple imports into same namespace (QTCREATORBUG-15684)
    * Added scanning of `app.qmltypes` and `lib.qmltypes` for type information
    * Fixed highlighting for new keywords in Qt 5.15
    * Fixed reading of `qmltypes` from Qt 5.15 (QTCREATORBUG-23855)
    
    ### Python
    
    * Added wizards for Qt Quick Application and Qt Widgets Application with `.ui` file
      (QTCREATORBUG-21824)
    
    ### Diff Viewer
    
    * Added support for staging only selected lines (QTCREATORBUG-19071)
    
    Projects
    --------
    
    * Added option to hide "disabled" files in Projects tree (QTCREATORBUG-22821)
    * Added option to filter output panes for lines that do not match expression (QTCREATORBUG-19596)
    * Added option for default build configuration settings (debug information, QML debugging, Qt Quick
      Compiler) (QTCREATORBUG-16458)
    * Added option to only build target for active run configuration (qmake & Qbs)
    * Added option to only stop the target of active run configuration on build (QTCREATORBUG-16470)
    * Added option for project specific environment (QTCREATORBUG-21862)
    * Added option to remove items from `Recent Projects` list in Welcome mode
    * Added option to start run configurations directly from target selector (QTCREATORBUG-21799)
    * Added option to build project for all configured kits (QTCREATORBUG-16815)
    * Added `-ensure-kit-for-binary` command line option that creates a kit for a binary's
      architecture if needed (QTCREATORBUG-8216)
    * Added GitHub build workflow to `Qt Creator Plugin` wizard template
    * Improved UI responsiveness while parsing projects (QTCREATORBUG-18533)
    * Fixed build directory after cloning target (QTCREATORBUG-23462)
    * Fixed copying of filtered text from output pane (QTCREATORBUG-23425)
    
    ### QMake
    
    * Improved renaming of files (QTCREATORBUG-19257)
    * Fixed handling of `object_parallel_to_source` (QTCREATORBUG-18136)
    * Fixed crash with circular includes (QTCREATORBUG-23567)
    * Fixed issue with renaming files (QTCREATORBUG-23720)
    
    ### CMake
    
    * Improved handling of `source_group` (QTCREATORBUG-23372)
    * Added support for `Add build library search path to LD_LIBRARY_PATH` (QTCREATORBUG-23464)
    * Added automatic registration of CMake documentation, if available (QTCREATORBUG-21338)
    * Fixed that `.cmake` directory was created in project source directory (QTCREATORBUG-23816)
    * Fixed issues with `snap` on Ubuntu Linux (QTCREATORBUG-23376)
    * Fixed handling of `Enable QML` in debugger settings (QTCREATORBUG-23541)
    * Fixed unneeded reparsing of files
    * Fixed code model issues with precompiled headers (QTCREATORBUG-22888)
    
    ### Qbs
    
    * Updated included Qbs version to 1.16.0
    * Changed to use separate Qbs executable instead of direcly linking to Qbs (QTCREATORBUG-20622)
    * Added option for default install root (QTCREATORBUG-12983)
    
    ### Python
    
    * Added option to disable buffered output (QTCREATORBUG-23539)
    * Added support for PySide 5.15 to wizards (QTCREATORBUG-23824)
    
    ### Generic
    
    * Improved performance for large file trees (QTCREATORBUG-20652)
    * Fixed that only first line of `.cflags` and `.cxxflags` was considered
    
    ### Compilation Database
    
    * Fixed that project was reparsed if compilation database contents did not change
      (QTCREATORBUG-22574)
    
    ### Nim
    
    * Added support for Nimble build system
    * Added support for `Follow Symbol Under Cursor`
    
    Debugging
    ---------
    
    * Added option to hide columns from views (QTCREATORBUG-23342)
    * Added option for `init` and `reset` GDB commands when attaching to remote server
    * Fixed pretty printer for `std::optional` (QTCREATORBUG-22436)
    
    Analyzer
    --------
    
    ### Clang
    
    * Improved filtering
    * Added `Analyze Current File` to `Tools` menu and editor context menu
    * Added context menu item that opens help on diagnostics
    
    ### CppCheck
    
    * Added option to trigger Cppcheck manually
    
    ### Chrome Traces
    
    * Added more details for counter items
    * Added option to restrict view to selected threads
    * Added information about percentage of total time for events
    
    ### Heob
    
    * Added support for settings profiles (QTCREATORBUG-23209)
    
    Qt Quick Designer
    -----------------
    
    * Added locking and pinning of animation curves (QDS-550, QDS-551)
    * Added support for annotations (QDS-39)
    * Fixed dragging of keyframes in curve editor (QDS-1405)
    * Fixed crash when selecting icon (QTCREATORBUG-23773)
    * Fixed missing import options (QDS-1592)
    
    Version Control Systems
    -----------------------
    
    ### Git
    
    * Added option to create branch when trying to push to a non-existing branch (QTCREATORBUG-21154)
    * Added option to start interactive rebase from log view (QTCREATORBUG-11200)
    * Added information about upstream status to `Git Branches` view
    * Added option to `grep` and `pickaxe` git log (QTCREATORBUG-22512)
    * Made references in VCS output view clickable and added context menu (QTCREATORBUG-16477)
    
    Test Integration
    ----------------
    
    * Added support for colored test output (QTCREATORBUG-22297)
    
    ### Google Test
    
    * Added support for internal logging (QTCREATORBUG-23354)
    * Added support for `GTEST_SKIP` (QTCREATORBUG-23736)
    
    Platforms
    ---------
    
    ### Windows
    
    * Improved behavior with regard to MSVC tool chain matching and compatibility of MSVC 2017 and
      MSVC 2019 (QTCREATORBUG-23653)
    
    ### macOS
    
    * Fixed parsing of Apple Clang specific linker message (QTCREATORBUG-19766)
    * Fixed `Run in Terminal` and `Open Terminal` when user has different shell configured
      (QTCREATORBUG-21712)
    
    ### Android
    
    * Discontinued support for Ministro
    * Added auto-detection of Java JDK (QTCREATORBUG-23407)
    * Added option to automatically download and install required Android tools (QTCREATORBUG-23285)
    * Added option to register multiple NDKs (QTCREATORBUG-23286)
    * Added automatic selection of correct NDK for Qt version (QTCREATORBUG-23583)
    * Added option to download and use [OpenSSL for Android](https://github.com/KDAB/android_openssl)
      (QTBUG-80625)
    * Added support for Android 11 with API level 30
    * Improved examples browser to only show items tagged with `android` (QTBUG-80716)
    * Improved manifest editor (QTCREATORBUG-23283)
    * Fixed issues with latest SDK r29 (QTCREATORBUG-23726)
    * Fixed several issues with AVD manager (QTCREATORBUG-23284, QTCREATORBUG-23448)
    * Fixed that some essential packages were not installed (QTCREATORBUG-23829)
    * Fixed that ABI selection in build configuration did not persist (QTCREATORBUG-23756)
    
    ### iOS
    
    * Improved examples browser to only show items tagged with `ios`
    
    ### Remote Linux
    
    * Added option to use custom command for install step (QTCREATORBUG-23320)
    * Added option to override deployment data (QTCREATORBUG-21854)
    
    ### Bare Metal
    
    * Added support for RL78 architecture
    * Added support for J-Link and EBlink GDB servers
    * Added support for KEIL uVision v5.x debugger
    
    ### MCU
    
    * Added auto-registration of documentation and examples (UL-1685, UL-1218)
    * Switched to MCUXpresso IDE instead of SEGGER JLink for NXP kits (QTCREATORBUG-23821)
    * Fixed issues with desktop kit (QTCREATORBUG-23820)
    * Fixed issues with RH850 (QTCREATORBUG-23822)

     


  17. با توجه به عنوان مقاله، شباهت‌های بسیاری بین std::string_view و std::span وجود دارد، در واقع، string_view و span اشیاء‌ای هستند که به یک ترتیبِ به هم پیوسته از عناصری اشاره دارند که نقطهٔ آغازین آن‌ها از موقعیت صفر است؛ و همچنین عملیات استاندارد نگه‌دارنده‌ها (ظرف) را ارائه می‌کنند. هر دو نوع شیء از نوع easy-to-copy (کپی آسان) هستند که دارای یک اشاره‌گر و یک عنصر اندازه هستند. از نظر مفهومی، آن‌ها دیدگاه‌های غیر صاحب یک آرایه (یا دنبالهٔ پیوسته) هستند که رابط استاندارد غنی‌ای را ارائه می‌کنند.

    در مورد تفاوت‌ها (اختلافات) بین این دو، <std::span<T یک الگوی نمایش آرایه‌ای با هدف کلی است، در حالی که std::string_view یک نمایش تخصصی‌تر در یک دنباله‌کاراکتر یا رشته است. در زیر شرح مختصری از این تفاوت‌ها آورده شده است:

    1. شیء span یک قالب (Template) است، اما string_view خیر!
      • شیء span، الگویی است که با هر نوعِ تعریف شده توسط کاربر کار می‌کند، در حالی که string_view به طور خاص نمای یک آرایهٔ مشخص پیوسته است. از نظر سطحی یک string_view معادل <span <char  است.
        char buff[] = "Hello World";
        
        auto sp = std::span<char>(&buff[0], 5);
        auto sv = std::string_view(&buff[6], 5);
        
        for(auto c : sp) 
          std::cout << c; //Hello
        
        std::cout << " ";
        
        for(auto c : sv) 
          std::cout << c; //World

        اما، ویژگی‌های string_view بیشتر از این مورد می‌تواند باشد.

    2. شیء string_view یک نوع فقط خواندنی برای نمایش است.
    3. یکی از ویژگی‌های برجستهٔ string_view این است که این شیء فقط یک نمایش فقط خواندنی است. بنابراین، ما نمی‌توانیم یک آرایهٔ زیرین را از طریق یک string_view تغییر دهیم، در حالی که این امکان از طریق span ممکن است:
      char str[] = "hello";
      
      //Change str to uppercase through span
      auto sp = std::span<char>(str,strlen(str));
      std::transform(sp.begin(), sp.end(), sp.begin(),
                     [](char c) { return std::toupper(c); });
      
      //str is now HELLO
      
      //Back to lowercase via string_view is not possible.
      auto sv = std::string_view(str);
      std::transform(sv.begin(), sv.end(), sv.begin(),
                     [](char c) { return std::tolower(c); }); //ERROR!

      اگر string_view فقط خواندنی باشد، طول آن به اندازهٔ کافی انعطاف‌پذیر است که از طریق <span <const T به یک نمایش فقط خواندنی تبدیل می‌شود. بنابراین یک string_view به یک <span <const char نزدیک‌تر است. البته یک ویژگی وجود دارد که string_view را تضمین می‌کند.

    4. شیء string_view از عملیات std::string-like پشتیبانی می‌کند.
    5. شیء span دارای چندین عملیات متوالی پیوسته است، به عنوان مثال: front, back, begin و operator[]. با این حال، string_view چندین روش دیگر مانند std::string دارد، به عنوان مثال: substr, find, compare سربارگذاری اپراتور‌ها (مانند == و < یا >). بنابراین، string_view می‌تواند نیازِ به std::string را در مواردی که فضای زیرین آن مهم نیست را از بین ببرد.
    • پسندیدن 1

  18. با سلام و درود،

    نسخهٔ ۵.۱۴.۰ به عنوان یک نسخهٔ ما قبل نهایی از ۵.۱۵ همراه با ویژگی‌های بسیاری ارائه شده است که در این میان ویرایش ۵.۱۴.۲ بعد از ۵.۱۴.۱ با برخی از بهبود‌ها و حل مشکلات گزارش شده منتشر شد.

    برخی از ویژگی‌های بسیار کاربردی که به کمک دوستان عزیز، @سروش ربیعی و @hamed_masafi به کتابخانهٔ QCalendar افزوده شده است. و از این نسخه به بعد امکان استفاده از تاریخ شمسی در کیوت فراهم می‌شود.

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

    یک مثال ساده:

    #include <QCoreApplication>
    #include <QCalendar>
    #include <QDate>
    #include <QDebug>
    
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        QCalendar cal(QLatin1String("jalali"));
    
        qDebug() << "availableCalendars=" << QCalendar::availableCalendars();
    
        QString todayJalali = QDate::currentDate().toString("yyyy-MM-dd", cal);
        qDebug() << "Today in jalali calendar=" << todayJalali;
    
        QDate d(1398, 10, 15, cal);
        qDebug() << "Date 1398/10/15 in julian calendar=" << d.toString();
    
        return a.exec();
    }

    ویژگی‌های جدید به صورت زیر می‌باشند:

    ماژول Qt3d

    • Threading architecture overhaul (removal of aspect thread)
    • Frontend/Backend node sync overhaul
    • QTransform now has access to the world matrix
    • Introduction of Scene3DView
    • Scene3D is now in sync with QtQuick
    • Scene3D can now render as an underlay without FBO

    ماژول Qt Bluetooth

    • [QTBUG-40698] Optional win32 backend to support Windows 7 and 8. Backend is not built by default and not part of the prebuild packages though.
    • QLowEnergyController: Introduce AuthorizationError
    • [QTBUG-76615] Ability to have multiple manufacturer data per manufacturer ID

    ماژول QtCore

     

    • QCalendar adds support for Calendars other than Gregorian, by implementation of suitable back-ends.

    • Back-ends to implement the Gregorian, Jalali (Persian), Islamic Civil, Milankovic, and Julian calendars. We look forward to other contributions.
    • [QTBUG-14150] Qt is now relocatable, i.e. it's possible to move the Qt installation without breaking functionality or loading of plugins.

    ماژول Qt GUI

     

    • QColorConstants provide constexpr QColor instances that don't cost any runtime overhead

    • Updated High-DPI support.
    • Applications can now opt-in to use non-integer scale factors, for example Windows at 150%. Use QGuiApplication::highDpiScaleFactorRoundingPolicy or QT_SCALE_FACTOR_ROUNDING_POLICY to set the rounding policy.
    • Added the QT_ENABLE_HIGHDPI_SCALING environment variable which enables high-dpi scaling based on display DPI. Replaces QT_AUTO_SCREEN_SCALE_FACTOR (now deprecated), and corresponds to the Qt::AA_EnableHighDpiScaling application attribute.
    • The QT_FONT_DPI environment variable is now supported cross-platform, for the purpose of developing and testing with specific DPI values.
    • Color-space support for images. Reading and writing color-spaces from JPEG, PNG, WebP and TIFF images, and performing color-space transformation on images.
    • QTextDocument/QTextTable now support
    • per-edge border styling via QTextTableCellFormat
    • border-collapse mode
    • HTML table style import (partial) and export
    • QTextDocument supports reading and writing Markdown format, as an alternative to HTML. If you read HTML and write Markdown, or vice-versa, the formatting should be preserved to the extent that the CommonMark and GitHub specs allow (including headings, tables, bullet lists, block quotes and code blocks); but we don't guarantee all cases yet, because it's thinly tested so far.

    ماژول Qt Multimedia

     

    • Added QVideoFrame::Format_YUV422P.

    • Introduced support of GStreamer OpenGL plugin.

    ماژول Qt Network

    • HTTP/2 configuration API
    • Network connectivity monitoring
    • [QTBUG-1538] Support Kerberos Proxy Authentication

    ماژول Qt QML

     

    • Added qmlRegisterSingletonInstance function. This allows to expose a QObject as a singleton to QML, without having to create a factory function as required by qmlRegisterSingletonType. It is meant as a type safe replacement of setContextProperty in common usages.
    • Added qmlRegisterAnonymousType as a replacement for qmlRegisterType. It allows to specify the URI and major version, which enables better tooling support.
    • qmllint gained an experimental -U option. If run with it, it warns about accesses to unqualified identifiers

    ماژول Qt Quick

     

    • Added the first preview of the graphics API independent scenegraph renderer as an opt-in feature. This allows running qualifying Qt Quick applications on top of Vulkan, Metal, or Direct3D 11 instead of OpenGL. The supported platforms are currently Windows 10, Linux with X11 (xcb), macOS with MoltenVK, or Android 7.0+ for Vulkan, macOS for Metal, Windows 10 for D3D.

    • Text and TextEdit now support Markdown format (CommonMark and GitHub dialects) as an alternative to HTML.
    • Includes the GitHub checklist extension, such that you can click to toggle checkboxes in a TextEdit.
    • TextEdit uses an I-beam cursor by default, and a pointing-hand cursor when hovering a checkbox or a link. You can still override the default cursor, though.
    • Added WheelHandler, an Event Handler for the mouse wheel, and optionally for emulated mouse wheel events coming from a trackpad.
    • Added BoundaryRule in Qt.labs.animation: a PropertyValueInterceptor that restricts the range of values a numeric property can have, applies "resistance" when the value is overshooting, and provides the ability to animate it back within range. It's particularly useful in combination with WheelHandler, to provide similar physics as Flickable has.
    • Event Handler base classes such as QQuickSinglePointHandler and QQuickMultiPointHandler have private implementation, while the classes themselves are suitable for subclassing, and are exported. They do not have supported public C++ API yet, but we encourage you to experiment with subclassing them anyway using the private API. They are intended to become public at some point in Qt 6 (and we can continue to iterate the API until then, especially to keep up with upcoming changes to the QEvent classes in Qt 6).
    • Image and BorderImage now have the same currentFrame and frameCount properties that AnimatedImage has; this allows choosing an individual ic

    ماژول Qt SerialBus

    • [QTBUG-72979] Added operators to compare QCanBusDevice::Filter for equality or inequality.
    • [QTBUG-70449] Added the QCanBusDevice::OperationError and QCanBusDevice::TimeoutError codes to signal wrong operation respectively timeout errors.
    • [QTBUG-70766] Added the function QCanBusDevice::busStatus() to query the CAN bus status from the CAN bus device.
    • [QTBUG-54943] Added the function QCanBusDevice::resetController() to reset a CAN controller from bus off state.
    • [QTBUG-75204] SocketCAN: Added the configuration parameter QCanBusDevice::ProtocolKey to use another protocol inside the protocol family PF_CAN.
    • [QTBUG-54296] SocketCAN: If libsocketcan is available, the CAN bus bitrate can be get and set at runtime.
    • PeakCAN: Added support for PCAN-USB devices on macOS by using the MacCAN library.
    • [QTBUG-75405][QTBUG-76232] Expose the underling QIODevice used for Modbus communication, e.g. for setting the serial port hardware flow control (RTS/CTS).

    ماژول Qt WebEngine

    • Updated to be based on Chromium 77
    • [QTBUG-74166] New API for control of QWebEnginePage life-cycle
    • [QTBUG-56978] Methods and properties for download item to get suggested name, and change the download directory and file name
    • [QTBUG-50420] New findTextFinished signal and corresponding QWebEngineFindTextResult and FindTextResult types to get extra information about the result of a text search
    • [QTBUG-55110][QTBUG-51176] Added methods to QWebEngineCertificateError to asynchronously handle an error, and get a chain of digital certificates

    ماژول Qt Widgets

    • QTextEdit and QTextBrowser now support Markdown format (CommonMark and GitHub dialects) as an alternative to HTML.
    • Includes the GitHub checklist extension, such that you can click to toggle checkboxes if the widget is editable.
    • QTextBrowser::setSource() detects Markdown based on the file extension.

     

    تغییرات در پلتفرم اندروید

    • Android needs NDKr20+
    • Added multi ABI build in one go. By default it will build for all android supported abis (arm64-v8a, armeabi-v7a, x86_64, x86). The user can control which ABIs he wants to use via ANDROID_ABIS qmake variable.
    • Added support for the new AAB package format, which allows deploying a single application bundle to Google Play which contains binaries for all supported ABIs.

    ماژول جدید

    • Qt Quick Timeline

    کیوت برای اتوماسیون

    • Qt KNX
      • Extended support for KNXnet/IP Core V2 (discovery, tunneling, routing, security)
    • Qt MQTT
      • Added support for using QSslConfiguration when connecting encrypted
      • Added autoKeepAlive property to enable manual connectivity checks
    • Qt OPC UA
      • Added tech preview for GDS client support
      • Updated 3rdparty open62541 to version 1.0
    • Qt CoAP
      • The module leaves the Tech Preview status behind and an API commitment is given.
    • پسندیدن 1

  19. در در 19 شهریور 1398 در 12:14، MahdiGameMaker گفته است :

    سلام دوستان.

     

    بعد از خروجی برنامه ام روی گوشیم در قسمت    Appilication output

           یک پیامی هر چند ثانیه یک بار ظاهر میشد.کنجکاو شدم بدونم دلیلش چیه!و ایا اهمیت داره یا نه؟

    QT5.13

    کتابخانه ها : quick sql androidextras core gui charts bluetooth

    
    D/TelephonyIcons( 1857): data type item id: 2131230725 roaming item id:2131230728

    این یک Log است.

×
×
  • جدید...