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

نیما غراب

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

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

  • روز های برد

    1

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

  1. نیما غراب

    سلام. به منظور بررسی ورودی‌های غیر مجاز می‌بایست از تابع cin.fail() استفاده کنین در غیر این صورت اتفاقات پیش بینی نشده از جمله مثالی که زدین رخ خواهد داد: #include <iostream> #include <stdlib.h> using namespace std; int main() { int a; cout << "Enter your Number : "; cin >> a; a = cin.fail() ? -1 : a; switch(a) { case 0: cout << "the baynariy is : " << a; cout << '\n'; break; case 1: cout << "the baynariy is : " << a; cout << '\n'; break; default : cout << "END"; system("cls"); } return 0; } در مورد سوال دومتون میتونین صفحه زیر رو مطالعه کنین که مزایا و معایب هر کدوم رو گفته: راه‌های مختلف جهت پاک کردن اطلاعات در کنسول
  2. سلام خدمت دوستان و اساتید گرامی. فرض کنین پنجره‌ای در برناممون داریم که از نوع QWidget هستش و میخوایم مختصات لحظه به لحظه حرکت موس رو بگیریم. خب در این حالت قاعدتا باید تابع QWidget::mouseMoveEvent رو بازنویسی و مطابق با کاری که میخوایم انجام بدیم تعریف کنیم. حالا اگر کاری که میخوایم در داخل تابع QWidget::mouseMoveEvent انجام بدیم زمان‌بر باشه برای جلوگیری از کند شدن برنامه و ایجاد تاخیر و از دست دادن جزئیات حرکت موس چه اقداماتی باید انجام بدیم؟ یکی راهی که به ذهن خودم رسید استفاده از یک نخ جدا برای انجام پردازش زمان‌بر هست ولی از اونجایی که لازمه قبل از اتمام تابع QWidget::mouseMoveEvent از join شدن نخ ایجاد شده اطمینان حاصل کنیم باز هم برنامه دچار تاخیر خواهد شد اگر هم بخوایم بلافاصله بعد از اجرای نخ اونو از نخ ایجاد کنندش جدا (detach) بکنیم بازم مشکل همچنان پا برجاست چون تابع QWidget::mouseMoveEvent پشت سر هم فراخوانی میشه و کلی نخ درست میشه که از نخ اصلی جدا شدن و نمیشه مدیریتشون کرد! در یک چنین وضعی چه کاری باید انجام بدیم؟ سپاس گزارم.
  3. به نام خدا با سلام خدمت دوستان گرامی. از آنجایی که کامپایل هر کتابخانه مرتبط با زبان 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; } چنانچه مشکل یا ایرادی در نوشته بالا ملاحظه نمودید، نگارنده مطلب را بی خبر نگذارید. سپاس فراوان.
  4. نیما غراب

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

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

    @کامبیز اسدزاده آقا کامبیز اگر بخوایم همزمان دو یا هر چند نوع فونتی که بخوایم رو در یک TextFieldیا TextInputیا... داشته باشیم باید چه کنیم؟ تغییر خاصیت font.family باعث میشه فونت کل متن باهم عوض شه در حالی که چیزی که مد نظر منه این هست که هرچی کارکتر فارسی هست فونتشون مثلا بی نازنین باشه و هرچی انگلیسی هست تایمز نیو رومن منتهی در یک TextFieldیا TextInputیا... الان با localeمیشه تشخیص داد کارکتر وارد شده انگلیسی هست یا فارسی ولی نمیدونم چه طوری باید همزمان روی یک متن دو یا چند نوع فونت رو اعمال کرد! سپاس گزارم.
  8. سلام بر دوستان و اساتید گرامی. پایه و اساس قیمت گذاری یک برنامه C++ چگونه هست؟ با سپاس فراوان.
  9. نیما غراب

    @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 بعدی نسبت به حرکات موس واکنش نشون می ده و نیاز به انجام کار خاص دیگه‌ای نیست.
  10. نیما غراب

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

    سلام بر دوستان گرامی و اساتید ارجمند. چه طوری در QML/Qt Quick میشه در یک TextArea یا دیگر اشیا مرتبط با تایپ متن، جوری تعریف شن تا وقتی کیبورد روی فارسی هست از فونت مثلا بی‌نازنین استفاده شه برای تایپ و وقتی کیبورد به زبان انگلیسی تغییر پیدا کرد از فونت مثلا تایمز نیو رومن استفاده شه؟ آیا اصلا QML یک همچین مکانیزمی رو در اختیار ما در سمت رابط کاربری قرار میده یا باید از خود C++ کمک گرفت؟ سپاس گزارم.
  12. به نام خدا در این مطلب قصد داریم تا طریقه پیکربندی پایگاه داده 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 با موفقیت نصب و پیکربندی شده است.
  13. سلام بر دوستان و اساتید گرامی. کاربرد کلمه کلیدی __decspec(dllexport) چیست و چه زمانی باید ازش استفاده کنیم؟ سپاس گزارم.
  14. نیما غراب

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

    سلام. این موضوع رو مطالعه کردین؟
  17. نیما غراب

    سلام. چنانچه در تنظیمات برنامه های مختلف تغییری ایجاد کنین به شما پیامی مبنی بر بازگشایی مجدد برنامه به منظور لحاظ شدن تغییرات جدید میده. این به این معنیه که خیلی از تنظیماتی که در برنامه ها انجام میدیم در فایلی در یکی از شاخه های برنامه بنا به صلاح دید سازندگان برنامه ذخیره میشه و هر بار که برنامه باز میشه اطلاعات از اون فایل خونده و در فصل جاری برنامه لحاظ میشه. (مثلا بازیابی اندازه های پنجره های مختلف در برنامه در آخرین بار استفاده و...) شما میتونین اطلاعاتی که مد نظرتون هست رو در فایل مخصوصی در مسیر برنامه یا هر جایی که صلاح میدونید ایجاد کنید و اطلاعات آرایتون رو داخلش ذخیره کنین. به عنوان مثال داریم: #include <QCoreApplication> #include <QFile> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QStringList text; QFile file("text.txt"); if (file.open(QIODevice::ReadOnly)) { QTextStream in(&file); while (!in.atEnd()) { text << in.readLine(); } file.close(); qDebug() << text << '\n'; }else{ if (file.open(QIODevice::WriteOnly)){ QTextStream out(&file); out << "Hello!\n" "Settings are saved here\n" "Goodbye!\n"; } qDebug() << "Setting successfully saved in file please reopen the app!\n"; } return a.exec(); } در این مثال ساده کاری که انجام میشه ابتدا بر روی هارد بررسی میشه که آیا فایل متنی text وجود داره یا خیر. اگر وجود داشت که محتویاتش خونده میشه و در داخل شی text ریخته میشه در غیر این صورت یک فایل متنی با این نام در پوشه حاوی پروژه کیوت ایجاد و مقادیر: !Hello و .Settings are saved here و !Goodbye اونجا ذخیره میشن. حالا اگر برنامه رو مجددا اجرا کنین اینبار اطلاعات از فایل text خونده میشن و در خروجی چاپ میشن.
  18. نیما غراب

    خیلی ممنونم آقا بهنام مشکل بعد از ذخیره کردن فایل .pro حل شد. سپاس گزارم.
  19. نیما غراب

    سلام به همه دوستان گرامی. من در آموزش های Qt دیدم که وقتی مدرس، فایل .pro پروژه رو تغییر میده، QMake به شکل خودکار اجرا میشه تا متناسب با تغییرات انجام شده Makefile جدید رو به روزرسانی کنه. اما من در Qt هر بار که فایل .pro رو تغییر میدم نیازه تا دوباره به شکل دستی روی نام پروژه راست کلیک و سپس run qmake رو انتخاب کنم. این آموزش ها البته قدیمین ولی من در نسخه های جدید Qt Creator چیزی مبنی بر اجرای خودکار QMake پیدا نکردم. حالا چه طوری میشه QMake به شکل خودکار پس از هر بار تغییر فایل .pro به اجرا شه؟ سپاس گزارم.
  20. نیما غراب

    سلام. به منظور شخصی سازی ویزارد یا ویرایش نوع کنونی ابتدا باید به مسیر ویزاردها در کیوت کریتور رفت: Qt\Tools\QtCreator\share\qtcreator\templates\wizards در این پوشه اطلاعات مربوط به ویزاردهای کیوت کریتور قابل مشاهده و ویرایش هست، همچنین میتونین با توجه به نمونه های موجود در ویزارد ازشون الگوبرداری کنین و ویزارد شخصی خودتون رو به کیوت کریتور اضافه کنین. جهت اطلاعات بیشتر پیشنهاد میکنم آموزش Introduction to Qt: A C++ Cross Platform Application Framework به تدریس Tod Gentille رو ببین. در قسمت VFP Getting Started - The Setup Tab View و درس Using and Modifying a Custom Class Wizard نمونه ای از همین کار آموزش داده میشه.
×
×
  • جدید...