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

GornerLabo

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

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

  • روز های برد

    6

پست ها ارسال شده توسط GornerLabo


  1. در 11 دقیقه قبل، بهنام صباغی گفته است :

    با سلام

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

    این مثال هم اوپن سورس هست میتونید ببینید با کیوت هم نوشته شده :

    GitHub - tsujan/Arqiver: Simple Qt archive manager based on libarchive,...

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

    موفق باشید.

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

    مرسی اقای صباغی


  2. با سلام و تبریک سال نو 

    دوستان برنامه ای دارم که مجبورم از 7z استفاده کنم. دلیل اجبار هم این است که با استفاده از 7z میشه فایل های موجود در آرشیو را مشاهده کرد و در QByteArray ذخیره کرد یعنی لازم به اکسترکت در مسیری از کامپیوتر نیست!

    اگر با QProcess بخواییم با 7z.exe فایلی را اکسترکت کنیم ساده س ولی برنامه به شکلی هست که نباید فایل های آرشیو (با فرمت های مختلف 7z , tar و ..) در مسیر کامپیوتر اکسترکت بشن بلکه لازمه در خود برنامه ، لیست فایل های موجود نمایش و ذخیره شوند  و برای هدف برنامه مورد  استفاده قرار بگیرن.

    تا جایی که جستجو و پرسش داشتم از دوستان ، میشه با 7z این عمل را انجام داد ولی هیچ داکیومنتی از 7z.dll در رابطه با Qt ندیدم. چون در Qt میشه راحت لیست فایل های موجود را در لیست ویجت ذخیره کرد و مورد استفاده قرار داد.

    اگر دوستان راهنمایی داشته باشند ممنون میشم


  3. دوستان فرض کنید فایلی رو میخونیم و اونو میریزیم توی یه متغیر از نوع QByteArray .  حالا باید متغیر از نوع  QByteArray به قسمت های کوچکتر با سایز مشخص تقسیم شوند ، به نحوی که هر قسمت ادامه قسمت بعدی باشه. برای استفاده از این تقسیم بندی باید هر قسمت به صورت جدا در برنامه استفاده بشه. از دوستان کسی میتونه راهنمایی کنه این مشکل رو چجوری باید حل کرد؟ آیا تابع مشخصی داره ؟


  4. یه جوابی گرفتم با این روش:

    اگه در کلاسمون به عنوان مثال دو اسلات تعریف کنیم و کاری که میخواییم رو انجام بدیم در اسلات ها تعریف کنیم و جایی که میخواییم به نوبت و با تایم مشخص اجرا بشن باید از این روش استفاده کنیم:

    QTimer::singleShot(1000,this, SLOT(slotFunction1()));
    QTimer::singleShot(2000,this, SLOT(slotFunction2()));

    دوستان اگه روش بهتری هم داشتند میتونن اینجا معرفی کنند . ممنون

    • تشکر شده 1

  5. سلام و خسته نباشید. من یه رشته ای رو برای اطلاع به کاربر در برنامه  میخواستم نمایش بدم. این رشته باید پشت سرهم و با اختلاف 1 ثانیه ای نمایش داده بشه. بعد این نمایش میخواستم تایمر متوقف شه . با کلاس تایمر تونستم با اتصال سیگنال timeout به اسلاتی از برنامه این کار رو انجام بدم اما اسلات بعد زمان تعیین شده مرتبا تکرار میشد. طبق مثال زیر عمل کردم. لطفا راهنمایی کنید ممنون.

    
    #include <QTimer>
    
    class ShowString: public QObject
    {
        Q_OBJECT
    private:
        QTimer *timer;
    public:
    
    public slots:
        void show();
    };
    #include "showstring.h"
    
    ShowString::ShowString()
    {
        timer = new QTimer(this);
        connect(timer,SIGNAL(timeout()),this,SLOT(show()));
        timer->start(1000);
    }
    
    void ShowString::show()
    {
        //my 3 line strings 
    
    }

     

    • تشکر شده 1

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

    سلام

    توی همین لینک یک مثال در ساده ترین حالت ممکن رو نوشته و از قابلیت‌هاش استفاده کرده شما چه مشکلی باهاش دارید ؟ یعنی کجاش رو مشکل دارید و متوجه نمی‌شید ؟ اصلا کد رو اجرا کردید ازش استفاده کردید ؟

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


  7. با سلام و خسته نباشید خدمت اساتید. بنا به نیازم مجبورم شدم با کلاس qcommandlineparser کارکنم. من میخوام با مثال ساده کار با این کلاس رو یاد بگیرم. داکیومنت این کلاس رو در این لینک  مطالعه کردم اما واقعیتش اونجور که باید و شاید مطلب رو نگرفتم. اگر از اساتید لطف کنن آموزشی در مورد این کلاس رو با ذکر مثال ساده اینجا بیان کنند بسیار ممنون خواهم شد. با تشکر


  8. سلام اساتید. برنامه داریم که با سخت افزار در ارتباط است. سخت افزار در قسمتی از برنامه جواب به صورت رشته برمیگرداند. ابتدای جواب ها به یک شکل است ولی در قسمتی از جواب ها تفاوت دارد. به عنوان مثال جواب ها شاید بدین شکل باشند:  ready , ready00 , ready0000, ready00044555 و ... . 

    ما نیاز داریم یک شرط فقط در برنامه قرار بدیم به این شکل که اگر جواب ready بود فلان دستور انجام بشه اگر جواب ready00 بود فلان دستور. جواب های دیگه طبق همین جواب دوم سنجیده میشه یعنی اگر جواب ها ready00 یا ready0000 یا ready00044555 باشه دستورات یکسان انجام بشه. پس ملاک 00 بعد ready هست. چطور با کلاس QString و QRegExp و تابع contains این مساله رو حل کرد

     

    تشکر از مدیریت و اساتید سایت


  9. در 35 دقیقه قبل، قاسم رمضانی منش گفته است :

    سلام ؛

    Container :

    این اسامی‌ای که اسم بردید. تماماً Continer هستند. و وظیفه نگه‌داری داده‌هارا دارند. برای اینکه برنامه‌نویس دستش باز باشه در مدیریت داده‌ها در زبان برنامه‌نویسی سی‌پلاس‌پلاس می‌تونید از این کانتینرها در جهت نگه‌داری داده‌هاتون استفاده کنید. که استفاده از توابع و کلاس‌های موجود در هدرفایل algorithm در کنار این کانتینرها پیشنهاد میشود و می‌تواند قدرت کنترل بیشتری به برنامه‌نویسی بر روی داده‌های خود بدهد. که خود بسیار در پرفورمنس (به انگلیسی : performance) برنامه تاثیر دارد.

    Qt Container :

    از آن‌جایی که Qt یک فریمورک هست. برای اینکه برنامه‌نویسی به راحتی بتواند با کلاس‌ها و توابع این فریمورک تعامل برقرار کند ؛ Qt یک‌سری از مخازن (معادل فارسی کانتینر) را بازنویسی کرده‌است. که می‌توانید در این لینک بیشتر در این‌‌باره مطالعه کنید.

     

     

    ممنون ازتون بابت پاسخگویی 


  10. روش دیگه برای ادد کردن کتابخانه رو هم امتحان کردم اوکی شد:

    یک پوشه ایجاد کنید مثلا در مسیر C:\Qt\lib-archive

    مرحله بعد در داخل همین پوشه lib-archive برای راحتی می‌توانید دو پوشه به نام های include و lib ایجاد کنید.

    در این مرحله باید فایل های .h از کتابخانه اصلی را در پوشه include کپی کنید و همچنین فایل بیلد شده از dll ها ( یا پسوند .a ) را در پوشه lib کپی کنید.

    به Qt رفته و یک پروژه ایجاد کنید و در داخل فایل .pro به صورت دستی کد زیر را اضافه کنید:

    INCLUDEPATH += "C:/Qt/lib-archive/include"
    LIBS += -L "C:/Qt/lib-archive/lib"
    LIBS += -llibarchive

    اکنون تغییرات فایل .pro  را ذخیره کرده و پروژه را یک بار بیلد کنید، کار تمام است و برای آزمایش می‌توانید طبق مثال های کتابخانه عمل کنید.

    با تشکر فراوان از اساتید محترم بخصوص آقای @کامبیز اسدزاده ?

    • تشکر شده 1

  11. در 15 دقیقه قبل، کامبیز اسدزاده گفته است :

    کتابخانه را که بیلد کردین قرار نیست .h را هم کنار فایل‌های بیلد شده قرار بدین!

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

     

    تشکر استاد

    • تشکر شده 1

  12. در ۱ ساعت قبل، کامبیز اسدزاده گفته است :

    خب خطایی که می‌گیری چی هست؟

    سعی کن از حالت داینامیک استفاده کنی، حالت Release یا Debug کتابخونه رو هم با برنامهٔ خودت هماهنگ کن.

    بعد بیلد ، کتابخانه به این شکل دراومد. لینک دانلود کتابخانه بیلد شده با کامپایلر mingw

    مشکل حالا نحوه اد کردن این کتابخانه س. فایل dll داره در فولدر bin ولی فایل .h نداره که داینامیک ادد کنم


  13. در 11 ساعت قبل، کامبیز اسدزاده گفته است :

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

    برنامه‌ command prompt رو اجرا و سورس رو با دستور mingw32-make کامپایل کنید.

    راهنمای ساخت این کتابخانه در Mingw و MSVC

    مشکل بیلد هم حل شد. سپاس استاد.

    برای اضافه کردن به پروژه از گزینه add library استفاده میکنم . برای این منظور بعد add library ، مسیر کتابخانه و فایل .a رو فقط میتونم اضافه کنم که با بیلد کردن پروژه با ارور مواجه میشم. گوگل کردم و چندجایی دیدم مشکل داشتن در ویندوز برای اضافه کردن. اینم حل شه ازتون ممنون میشم


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

    با سلام

    میتونید از کتابخانه هایی که برای این کار وجود داره استفاده کنید نگاهی به بخش Compression لینک Awesome C/C++ بندازید کتابخانه‌های خوبی فراهم هست.

    موفق باشید.

    دوره تصویری برای آموزش این کتابخانه دارین؟


  15. با سلام و خسته نباشید خدمت اساتید محترم. اگه بخواییم در QWidget یک فایل فشرده با فرمت های مختلف همچون zip , RAR , tar و ... را فراخوانی کنیم و فایل های محتوایی که در این فایل فشرده هست را در برنامه استخراج (Extract) کرده و به صورت یک لیست دربیاریم و به صورت دلخواه هر فایل را جدا استفاده کنیم باید به چه شکل عمل کنیم؟ آیا کتابخانه خاصی داره برای این کار ؟ اگر مثال در این مورد سراغ دارین ممنون میشم کمک کنید.

    با تشکر


  16. با سلام. برای رایت دستورات در QSerialPort چندین روش هست که به ترتیب عبارتند از:

    1- دستورات رشته ای:

    QString str = "command\r\n";
            port->write(str.toStdString().c_str());

    2- فایل های باینری:

        QFile file(":/bin/file.bin");
            if(!file.open(QIODevice::ReadOnly))return;
            QByteArray data = file.readAll();
        port->write(data);

     3- متغیر QByteArray:

    که مشکل من در این قسمت هست. فرض کنید متغیر زیر تعریف شده:

    QByteArray ba;
            ba.resize(100);
            ba.fill(0x00);
            ba[0] = 0x01;
            ba[8] = 0x0a;

    اگر این متغیر را در یک فایل باینری ذخیره کنیم مشکلی در رایت نیست اما اگر بدون ذخیره در باینری بخواهیم در پورت سریال رایت کنیم ، عمل رایت انجام نمیشه


  17. با سلام خدمت اساتید محترم. اگر بخواهیم مقدار بازگشتی از رایت چندین دستور در مورد کلاس QSerialPort به صورت دلخواه ذخیره کنیم باید به چه شکل عمل کرد؟

     

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

    port->setPortName(""); // COM PORT NAME
    port->setBaudRate(QSerialPort::Baud9600);
    port->setFlowControl(QSerialPort::NoFlowControl);
    port->setParity(QSerialPort::NoParity);
    port->setDataBits(QSerialPort::Data8);
    port->setStopBits(QSerialPort::OneStop);
    port->open(QSerialPort::ReadWrite);
    
    if(port->isOpen())
    {
    
    port->write(); // command 1 for write
    port->write(); // command 2 for write
    port->write(); // command 3 for write
    port->write(); // command 4 for write
    
    }

    حالا برای هر دستور رایت یک مقدار بازگشتی دریافت خواهیم کرد. پس میتوان با connect سیگنال readyRead با یک اسلات به صورت کد زیر این مقدار بازگشتی رو ذخیره کرد:

    connect(port,SIGNAL(readyRead()),this,SLOT(MySlot()));
    
    
    QByteArray b = port->readAll();
    QFile file("e:/test/raw.bin");
    if(!file.open(QIODevice::WriteOnly | QIODevice::Append))return;
    file.write(b);
    file.flush();
    file.close();

    حالا اگر بخواهیم مقدار بازگشتی رو از دستور رایت مشخصی دریافت کنیم ، شیوه صحیح کار چطور است؟


  18. آقا فرهاد الان توی برنامه م یک تابع دارم که یه اسلاتی رو اجرا میکنه. تا جایی که اطلاع دارم اسلات میره تو ترد بعد اجرا. پس چرا وقتی این تابع اجرا میشه ( در اصل اسلات رو اجرا میکنه) تا اسلات کارش تموم نشده ، ui هنگ میکنه؟

×
×
  • جدید...