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

نیما غراب

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

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

  • روز های برد

    1

آخرین بار برد نیما غراب در 5 اسفند 1398

نیما غراب یکی از رکورد داران بیشترین تعداد پسند مطالب است !

اعتبار در سایت

7 خوب

درباره نیما غراب

  • تاریخ تولد تعیین نشده

اطلاعات شبکه‌ای

موقعیت

  • شهر
    مشهد
  1. به نام خدا با سلام خدمت دوستان گرامی. از آنجایی که کامپایل هر کتابخانه مرتبط با زبان C++ در ویندوز نکات و فوت و فن خاص خود را دارد لذا تصمیم بر آن شد تا در اینجا به نحوه کامپایل کتابخانه Curl در این سیستم عامل بپردازیم. مشخصات کلی کامپایلر و کتابخانه به شرح زیر می‌باشد: Curl: 7.68.0 Microsoft Build Tools: 15.9.18 Compiler and OS Architectures: x64 ابتدا به این سایت رفته و کد منبع Curl را دریافت نمایید، دقت کنید که باینری کتابخانه Curl برای ویندوز موجود است ولی با کامپایلر MinGW برای ویندوز کامپایل شده که مطلوب ما نمیباشد. به دلیل اعلام نویسندگان Curl در رابطه با نگه‌داری ضعیف در پشتیبانی از CMake لذا به شکل مستقیم از کنسول مایکروسافت و Makefile سازگار با آن یعنی Makefile.vc استفاده خواهد شد. پس از دریافت و استخراج محتویات، می‌بایست کنسولx64 Native Tools Command Prompt for VS 2017 را باز کرده و دستورات زیر را مطابق شکل در آن وارد می‌کنیم: F: cd F:\curl-7.68.0\winbuild که دستور اول برای تغییر درایور و دستور دوم نشانی محل استخراج کتابخانه Curl روی سیستم نگارنده مطلب می‌باشد. سپس دستور زیر را وارد می‌کنیم: nmake /f Makefile.vc mode=dll که در دستور بالا /f مشخص کننده نشانی makefileمورد نظر و modeمشخص کننده نحوه کامپایل کتابخانه به شکل ایستا یا پویا را شامل می‌شود که در اینجا کتابخانه به شکل پویا کامپایل می‌شود. چنانچه مایل باشیم کتابخانه به شکل ایستا کامپایل شود می‌بایست دستور زیر را وارد کنیم: nmake /f Makefile.vc mode=static پس از ورود دستور بالا کتابخانه در مسیر F:\curl-7.68.0\ پوشه‌ای با نام buildsساخته و فایل‌های حاصل از کامپایل را در آن ذخیره می‌کند که در تصویر زیر نتیجه نهایی کامپایل آورده شده است. حال یک پروژه ساده از نوع Plain C++ Application در Qt Creator به منظور آزمایش کامپایل صحیح کتابخانه Curl ایجاد می‌کنیم. قطعه کد زیر را در فایل main.cpp وارد می‌کنیم: #include <curl\curl.h> int main() { CURL *curl; curl = curl_easy_init(); curl_easy_cleanup(curl); return 0; } و درنهایت در فایل CMake پروژه دستورات زیر را وارد می‌کنیم: cmake_minimum_required(VERSION 3.5) project(Curl LANGUAGES CXX) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_executable(Curl main.cpp) target_include_directories(Curl PRIVATE "F:/curl-7.68.0/builds/libcurl-vc-x64-release-dll-ipv6-sspi-winssl/include") target_link_libraries(Curl PRIVATE "F:/curl-7.68.0/builds/libcurl-vc-x64-release-dll-ipv6-sspi-winssl/lib/libcurl.lib") در گام آخر نیاز است تا فایل dll حاصل از کامپایل کتابخانه را در کنار فایل اجرایی پروژه قرار داده تا برنامه بدون مشکل اجرا شود این فایل در شاخه bin واقع در پوشه builds محل کامپایل کتابخانه موجود می‌باشد. چنانچه کتابخانه را به شکل ایستا کامپایل کرده باشیم نیاز است تا ماکرو CURL_STATICLIB را قبل از ورود هرگونه فایل سرآیند کتابخانه Curl مطابق زیر تعریف کنیم: #define CURL_STATICLIB متن کامل کد با رعایت نکته گفته شده چنین می‌باشد: #define CURL_STATICLIB #include <curl\curl.h> int main() { CURL *curl; curl = curl_easy_init(); curl_easy_cleanup(curl); return 0; } چنانچه مشکل یا ایرادی در نوشته بالا ملاحظه نمودید، نگارنده مطلب را بی خبر نگذارید. سپاس فراوان.
  2. نیما غراب

    @قاسم رمضانی منش خیلی ممنونم ازتون. همون اول توضیحات هر کلاس که مینویسه مثلا Rectangle از Item ارث میبره منظورم بود. قبلش من در این مورد جست و جو کردم ولی چیزی پیدا نکردم. آقا قاسم این کلاس AnotherRec از بیرونی‌ترین شی تعریف شده در فایل AnotherRec.qml فقط ارث میبره؟ یعنی اگر فرضا همین Rectangle رو در داخل یک Item بزاریم دیگه از Rectangle چیزی ارث نمیبره؟ سپاس فراوان.
  3. سلام بر دوستان و اساتید گرامی. من در مستندات QML زیاد دیدم که نوشته فلان جز از جزئی دیگر ارث برده. حالا سوالم اینجاست که این وراثت با خود QML پیاده سازی میشه یا در سمت C++ این کار رو انجام میدن؟ اگر وراثت با خود QML قابل پیاده‌سازی هست میشه در مثالی ساده توضیح بدین؟ سپاس گزارم.
  4. نیما غراب

    @کامبیز اسدزاده دستتون درد نکنه خیلی ممنونم. این کدی که گفتین نتیجه عکسی میشه که پیوست کردم؟ مستطیل سبز یک Field هست که همزمان از دو نوع فونت برای نمایش متن استفاده شده فارسی بی نازنین هست و انگلیسیش تایمز نیو رومن. من مشابه این کدی که گفتین رو نوشتم ولی فونت کل متن باهم تغییر میکنه!
  5. نیما غراب

    @کامبیز اسدزاده آقا کامبیز اگر بخوایم همزمان دو یا هر چند نوع فونتی که بخوایم رو در یک TextFieldیا TextInputیا... داشته باشیم باید چه کنیم؟ تغییر خاصیت font.family باعث میشه فونت کل متن باهم عوض شه در حالی که چیزی که مد نظر منه این هست که هرچی کارکتر فارسی هست فونتشون مثلا بی نازنین باشه و هرچی انگلیسی هست تایمز نیو رومن منتهی در یک TextFieldیا TextInputیا... الان با localeمیشه تشخیص داد کارکتر وارد شده انگلیسی هست یا فارسی ولی نمیدونم چه طوری باید همزمان روی یک متن دو یا چند نوع فونت رو اعمال کرد! سپاس گزارم.
  6. سلام بر دوستان و اساتید گرامی. پایه و اساس قیمت گذاری یک برنامه C++ چگونه هست؟ با سپاس فراوان.
  7. سلام. شما نمیتونین در QML در قسمت های اسکریپتی، مثل بدنه توابع جاوا اسکریپت یا داخل سیگنال ها به صورتی که مثال زدین شی درست کنین. کاری که میتونین بکنین این هستش که صفحه خوش‌آمد گویی رو بسازین ولی خاصیت visibleرو غیرفعال کنین و زمانی که در پایگاه داده اطلاعات شخص رو پیدا نکردین، خاصیت یاد شده رو فعال کنین تا صفحه خوش‌آمدگویی نمایش داده شه. اگر از لحاظ حافظه در تنگنا هستین، به منظور ایجاد شی در درون ناحیه اسکریپتی چنانچه از انواع خود Qt باشند میبایست از تابع createQmlObject استفاده کنین: import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Window 2.12 Window { id: mainWindows visible: true width: 640 height: 480 title: qsTr("Hello World") Button{ id: blueSquare anchors.centerIn: parent anchors.horizontalCenterOffset: -100 text: "Blue Square" onClicked: Qt.createQmlObject("import QtQuick 2.12; Rectangle {color: \"Blue\"; y: 50; width: 100; height: 100}", blueSquare); } Button{ id: yellowSquare anchors.centerIn: parent anchors.horizontalCenterOffset: 100 text: "Yellow Square" onClicked: Qt.createQmlObject("import QtQuick 2.12; Rectangle {color: \"Yellow\"; y: 50; width: 100; height: 100}", yellowSquare); } } از اونجایی که Welcome.qml رو خودتون نوشتین چنانچه بخواین به شکل پویا ازش نمونه بسازین باید به این شکل عمل کنین: import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Window 2.12 Window { id: mainWindows visible: true width: 640 height: 480 title: qsTr("Hello World") Button{ id: welcom anchors.centerIn: parent text: "Welcome Button" onClicked:{ var component = Qt.createComponent("Welcome.qml"); component.createObject(welcom, { y: 50, width: 100, height: 100}); } } }
  8. نیما غراب

    @amirb سلام بر شما. من مثال شما رو کمی تغییرات دادم، در قالب فایلی به نام NestedFlicker: // The file name is NestedFlicker.qml import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Window 2.12 Page { id: page visible: true anchors.fill: parent Flickable{ anchors.fill: parent contentHeight: objects.height flickableDirection: Flickable.VerticalFlick Item{ id: objects width: page.width height: childrenRect.height Rectangle { id: rect width: 300 height: 200 color: "#00000000" border.width: 1 border.color: 'grey' radius: 5 anchors.horizontalCenter: parent.horizontalCenter anchors.top: parent.top anchors.topMargin: 10 Flickable { flickableDirection: Flickable.VerticalFlick anchors.fill: rect anchors.leftMargin: 5 anchors.rightMargin: 5 TextArea.flickable: TextArea { id: textarea horizontalAlignment: Text.AlignLeft wrapMode: TextEdit.WordWrap font.pointSize: 40 } } } Rectangle { id: rect2 width: 300 height: 1000 anchors.horizontalCenter: parent.horizontalCenter color: "Blue" y: page.height / 2 } } } } در فایل اصلی برنامه هم ازش نمونه ساختم: // The file name is main.qml import QtQuick 2.12 import QtQuick.Window 2.12 Window { visible: true minimumWidth: 800 minimumHeight: 600 NestedFlicker{ } } به طور عادی هر وقت Flickableشامل متن، به انتها برسه، Flickable بعدی نسبت به حرکات موس واکنش نشون می ده و نیاز به انجام کار خاص دیگه‌ای نیست.
  9. نیما غراب

    @کامبیز اسدزاده دستتون درد نکنه خیلی ممنونم. خب مشکل من الان همین isLatin هست که نمیدونم چه طوری باید در زمان اجرا با توجه به اینکه کاربر، کیبوردش رو روی چی گذاشته باشه تغییرش بدم! رویدادی یا سیگنالی برای اینکار وجود نداره که مثلا هروقت کاربر زبان تایپ رو عوض کرد بشه ازش مطلع شد و نوعشم فهمید؟
  10. نیما غراب

    سلام بر دوستان گرامی و اساتید ارجمند. چه طوری در QML/Qt Quick میشه در یک TextArea یا دیگر اشیا مرتبط با تایپ متن، جوری تعریف شن تا وقتی کیبورد روی فارسی هست از فونت مثلا بی‌نازنین استفاده شه برای تایپ و وقتی کیبورد به زبان انگلیسی تغییر پیدا کرد از فونت مثلا تایمز نیو رومن استفاده شه؟ آیا اصلا QML یک همچین مکانیزمی رو در اختیار ما در سمت رابط کاربری قرار میده یا باید از خود C++ کمک گرفت؟ سپاس گزارم.
  11. به نام خدا در این مطلب قصد داریم تا طریقه پیکربندی پایگاه داده MySQL را با استفاده از کامپایلر مایکروسافت بر روی سیستم عامل ویندوز، بررسی نماییم. در ابتدا می‌بایست پایگاه داده MySQL را بر روی سیستم خود نصب نماییم. بدین منظور به آدرس این آدرس رفته و سپس و نصاب آنلاین یا آفلاین آن را دریافت و بر روی سیستم خود نصب می‌نماییم. حال لازم است تا مسیر qmake مربوط به کیت مورد نظر واقع در محل نصب کتابخانه کیوت به متغیر محیطی Path سیستم عامل معرفی شود. در اینجا قصد داریم تا از MSVC 2017 64 bit استفاده کنیم که بر روی سیستم عامل 64 بیتی اجرا شده و خروجی دودویی برای سیستم عامل 64 بیتی تولید می‌کند. مطابق شکل زیر مسیر qmake مورد نظر را به Path سیستم عامل اضافه می‌کنیم: پس از این کار از منوی Start پوشه Visual Studio 2017 را انتخاب کرده و سپس x64 Native Tools Command Prompt for VS 2017 را انتخاب کرده تا کنسول باز شود. حال می‌بایست به آدرس محل درایور پایگاه داده کیوت برویم. بدین منظور دستور زیر را در کنسول وارد می‌کنیم: C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools>F: F:\>cd F:\Softwares\Qt\5.13.1\Src\qtbase\src\plugins\sqldrivers دستور اول به منظور تغییر درایو از C به F وارد شده و دستور دوم آدرس محل نصب کیوت روی سیستم نگارنده مطلب می‌باشد. حال دستور زیر را وارد می‌کنیم: qmake -- MYSQL_INCDIR="C:\Program Files\MySQL\MySQL Server 8.0\include" MYSQL_LIBDIR="C:\Program Files\MySQL\MySQL Server 8.0\lib" فراخوانی دستور qmake سبب ایجاد یک makefile شده که بعدا برای کامپایل درایور MySQL استفاده می‌شود. آدرس‌های بالا نیز محل نصب پایگاه داده MySQL در حالت پیشفرض را نشان میدهد. پس از اتمام عملیات نتیجه زیر می‌بایست حاصل شود: ملاحظه می‌شود که در مقابل MySql کلمه yes نوشته شده که این به معنی موفقیت آمیز بودن یافتن درایور MySQL می‌باشد. در نهایت با دستور زیر عملیات کامپایل آغاز می‌شود: nmake sub-mysql پس از اتمام این مرحله نیز در پایان دستور زیر را اجرا کرده تا فایل‌های کامپایل شده، نصب شوند: nmake install محل نصب این فایل‌های راه انداز درایور در مسیر زیر می‌باشد: F:\Softwares\Qt\5.13.1\Src\qtbase\src\plugins\sqldrivers\plugins\sqldrivers در مسیر بالا دو فایل به نام‌های qsqlmysql.dll و qsqlmysqld.dll وجود دارد که باید در کنار فایل اجرایی برنامه کامپایل شده قرار گیرد تا برنامه به درستی اجرا شود. همچنین در مسیر: C:\Program Files\MySQL\MySQL Server 8.0\lib فایل libmysql.dll وجود دارد که می‌بایست در مسیر فایل اجرایی برنامه قرار گیرد. در پایان نوبت به این رسیده تا با ایجاد یک پروژه آزمایشی در Qt Creator بررسی کنیم تا همه چیز به درستی پیکربندی شده باشد. قبل از آن می‌‎بایست یک پایگاه داده آزمایشی در MySQL ایجاد کرده و سپس با استفاده از کتابخانه کیوت به آن متصل شویم. ابتدا خط فرمان MySQL را باز کرده و دستور زیر را وارد می‌کنیم: CREATE DATABASE mydatabase; که mydatabase نام پایگاه داده ایجاد شده می‌باشد. حال پس از ایجاد یک پروژه ساده در Qt Creator محتویات فایل .pro را مطابق شکل زیر وارد می‌کنیم: QT += core sql TEMPLATE = app CONFIG += console c++11 CONFIG -= app_bundle SOURCES += \ main.cpp و در فایل main.cpp خواهیم داشت: #include <iostream> #include <QtSql/QSqlDatabase> #include <QtSql/QSqlError> #include <QDebug> using namespace std; int main() { QSqlDatabase db {QSqlDatabase::addDatabase ("QMYSQL")}; db.setHostName ("localhost"); db.setDatabaseName("mydatabase"); db.setUserName ("root"); db.setPassword ("123456789"); if(db.open ()) { qDebug() << "Success!"; } else { qDebug() << db.lastError ().text (); } } با ساخت و اجرا پروژه باید پیام Success! در خروجی نمایش داده شود. این یعنی پایگاه داده MySQL با موفقیت نصب و پیکربندی شده است.
  12. سلام بر دوستان و اساتید گرامی. کاربرد کلمه کلیدی __decspec(dllexport) چیست و چه زمانی باید ازش استفاده کنیم؟ سپاس گزارم.
  13. نیما غراب

    کتاب بسیار عالی و مفید، به همراه مثال‌های کاربردی هست و علاوه بر محتوای عالی و غنی که داره، پشتیبانی عالی هم توسط آقای اسدزاده میشه و دائما در حال به روزرسانی و همگامسازی با آخرین تغییرات هست. هر مشکلی هم که به شخصه دیدم و به آقای اسدزاده گزارش دادم به سرعت پاسخ دادن و مشکل رو بر طرف و راهنمایی کردن چیزی که قطعا ارزشش خیلی خیلی بالاست. با سپاس بیکران از آقای اسدزاده گرامی.
  14. سلام بر دوستان گرامی. فرض کنین ما در برنامه ای که با زبان C++ قراره نوشته بشه محاسبات ماتریسی داریم که بزرگ و زمانبر هست و برای انجام اون از کتابخانه Eigen استفاده میکنیم. چنانچه بخوایم پس از اتمام محاسبات ماتریسی، نتیجه رو در رابط کاربری که داریم نمایش بدیم اعم از نمایش به شکل Spreadsheet و یا رسم روی نمودار و... مجبوریم اشیا ساخته شده با Eigen رو به آرایه های مورد استفاده در Qt نظیر QVector یا QList و... تبدیل کنیم. حالا اگر تکرار این محاسبات زیاد باشه این تغییر نوع اشیا کاملا روی سرعت اجرای برنامه تاثیر میزاره حالا زبان C++ برای حل این نوع از مشکلات که برنامه نویس رو مجبور به تغییر نوع متغیر برای استفاده در هر نوع کتابخانه میکنه چه فکری کرده؟ آیا راهی هست که بشه مستقیم بین این کتابخانه ها ارتباط برقرار کرد به طوری که: نیاز به تغییر در کد منبع هیچ یک از کتابخانه‌ها نباشه چون این کار زمان بر هست و نیاز به تجربه بالایی در کار با اون کتابخانه خاص داره و قراره محتویات اون دستکاری و قاعدتا کتابخانه مجددا به خاطر اون تغییر، همگردانی بشه. آیا از وراثت میشه برای یکپارچه سازی بین اشیا موجود در کتابخانه های مختلف استفاده کرد؟ یا راه حل دیگه ای وجود داره؟ مثال Eigen و Qt صرفا برای بیان بهتر این مشکل آورده شد. سپاس گزارم.
  15. نیما غراب

    سلام. این موضوع رو مطالعه کردین؟
×
×
  • جدید...