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

نیما غراب

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

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

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

4 خوب

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

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

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

موقعیت

  • شهر
    مشهد
  1. نیما غراب

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

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

    @کامبیز اسدزاده آقا کامبیز اگر بخوایم همزمان دو یا هر چند نوع فونتی که بخوایم رو در یک TextFieldیا TextInputیا... داشته باشیم باید چه کنیم؟ تغییر خاصیت font.family باعث میشه فونت کل متن باهم عوض شه در حالی که چیزی که مد نظر منه این هست که هرچی کارکتر فارسی هست فونتشون مثلا بی نازنین باشه و هرچی انگلیسی هست تایمز نیو رومن منتهی در یک TextFieldیا TextInputیا... الان با localeمیشه تشخیص داد کارکتر وارد شده انگلیسی هست یا فارسی ولی نمیدونم چه طوری باید همزمان روی یک متن دو یا چند نوع فونت رو اعمال کرد! سپاس گزارم.
  5. سلام بر دوستان و اساتید گرامی. پایه و اساس قیمت گذاری یک برنامه C++ چگونه هست؟ با سپاس فراوان.
  6. سلام. شما نمیتونین در 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}); } } }
  7. نیما غراب

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

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

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

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

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

    سلام. چنانچه در تنظیمات برنامه های مختلف تغییری ایجاد کنین به شما پیامی مبنی بر بازگشایی مجدد برنامه به منظور لحاظ شدن تغییرات جدید میده. این به این معنیه که خیلی از تنظیماتی که در برنامه ها انجام میدیم در فایلی در یکی از شاخه های برنامه بنا به صلاح دید سازندگان برنامه ذخیره میشه و هر بار که برنامه باز میشه اطلاعات از اون فایل خونده و در فصل جاری برنامه لحاظ میشه. (مثلا بازیابی اندازه های پنجره های مختلف در برنامه در آخرین بار استفاده و...) شما میتونین اطلاعاتی که مد نظرتون هست رو در فایل مخصوصی در مسیر برنامه یا هر جایی که صلاح میدونید ایجاد کنید و اطلاعات آرایتون رو داخلش ذخیره کنین. به عنوان مثال داریم: #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 خونده میشن و در خروجی چاپ میشن.
×
×
  • جدید...