رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران
  • 0
er.khanaki

به‌روز‌رسانی TextArea در Qml توسط ++C


سوال

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

یک کلاس سی داریم که ارتباط سریال رو انجام میده و من با این کد

qmlRegisterType<serialPort>("io.qt.Serial.SerialPort", 1, 0, "SerialPort");

کلاس سی رو نمونه سازی کردم در qml.

مشکل اینجاست که چطور زمانی که در سی و توسط پورت سریال اطلاعاتی رو دریافت کردم textarea در qml مقادیر رو نمایش بده.

کد دریافت از سریال در کلاس سی ++

QString serialPort::getData()
{
    QByteArray serialData;
    QString serialBuffer = "";

    serialData = _serialport->readAll();
    serialBuffer = QString::fromStdString(serialData.toStdString());
    qDebug() << serialBuffer;
    return  serialBuffer;
}

textarea in qml

 

    Rectangle
    {
        id:containerTextArea
        width: parent.width
        anchors.top: container.bottom
        anchors.bottom: btnClearTextCommunication.top
        color: "#e0e0eb"

        TextArea
        {
            id:txtCommunication
            anchors.fill: parent;
            readOnly: true
        }
    }

 

نمونه سازیم  کلاس سی++

 

    SerialPort
    {
        id:serialport
    }

 

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

3 پاسخ به این سوال تا کنون داده شده است

پست های پیشنهاد شده

  • 0
در 12 ساعت قبل، er.khanaki گفته است :

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

یک کلاس سی داریم که ارتباط سریال رو انجام میده و من با این کد


qmlRegisterType<serialPort>("io.qt.Serial.SerialPort", 1, 0, "SerialPort");


کلاس سی رو نمونه سازی کردم در qml.

مشکل اینجاست که چطور زمانی که در سی و توسط پورت سریال اطلاعاتی رو دریافت کردم textarea در qml مقادیر رو نمایش بده.

کد دریافت از سریال در کلاس سی ++


QString serialPort::getData()
{
    QByteArray serialData;
    QString serialBuffer = "";
 
    serialData = _serialport->readAll();
    serialBuffer = QString::fromStdString(serialData.toStdString());
    qDebug() << serialBuffer;
    return  serialBuffer;
}

textarea in qml


    Rectangle
    {
        id:containerTextArea
        width: parent.width
        anchors.top: container.bottom
        anchors.bottom: btnClearTextCommunication.top
        color: "#e0e0eb"
 
        TextArea
        {
            id:txtCommunication
            anchors.fill: parent;
            readOnly: true
        }
    }

نمونه سازیم  کلاس سی++


    SerialPort
    {
        id:serialport
    }

 

سلام،

تابع getData رو باید برای کیو‌ام‌ال فراخوانی کنید.

قبل از تابع بهتره Q_INVOKBLE رو قرار بدی تا بتونی تحت QML بهش دسترسی داشته باشی.

اگر که توابع شما همانطور که به نظر میاد پیچیده هستند از آموزش زیر الگو بگیرید.

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
ارسال شده در (ویرایش شده)
در 3 ساعت قبل، کامبیز اسدزاده گفته است :

سلام،

تابع getData رو باید برای کیو‌ام‌ال فراخوانی کنید.

قبل از تابع بهتره Q_INVOKBLE رو قرار بدی تا بتونی تحت QML بهش دسترسی داشته باشی.

اگر که توابع شما همانطور که به نظر میاد پیچیده هستند از آموزش زیر الگو بگیرید.

 

تشکر برای جواب

تابع getdata برای qml فراخوانی کردم مشکل اینجاست وقتی در textarea این تابع رو فراخوانی میکنم فقط یک بار اجرا میشه.

            TextArea
        {
            id:txtCommunication
            anchors.fill: parent;
            readOnly: true
            text: serialport.getData();
        }

درخود کلاس qserialport یک سیگنال وجود دارد که هر وقت دیتا ای در حال دریافت می باشد تابع getData رو اجرا میکنه. مشکل زمانی به وجود می یاد که می خوام هر و وقت تابع getData اجرا می شه و داده ها از سریال پورت دریافت می شود به صورت اتوماتیک به qml ارسال شده و در textarea نمایش دهد.

 

.
QObject::connect(_serialport,SIGNAL(readyRead()),this,SLOT(getData()));

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

mySignal:txtCommunication.serialport.getData()

 

ویرایش شده در توسط er.khanaki

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 44 دقیقه قبل، er.khanaki گفته است :

تشکر برای جواب

تابع getdata برای qml فراخوانی کردم مشکل اینجاست وقتی در textarea این تابع رو فراخوانی میکنم فقط یک بار اجرا میشه.


            TextArea
        {
            id:txtCommunication
            anchors.fill: parent;
            readOnly: true
            text: serialport.getData();
        }

درخود کلاس qserialport یک سیگنال وجود دارد که هر وقت دیتا ای در حال دریافت می باشد تابع getData رو اجرا میکنه. مشکل زمانی به وجود می یاد که می خوام هر و وقت تابع getData اجرا می شه و داده ها از سریال پورت دریافت می شود به صورت اتوماتیک به qml ارسال شده و در textarea نمایش دهد.

 


.

QObject::connect(_serialport,SIGNAL(readyRead()),this,SLOT(getData()));

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


mySignal:txtCommunication.serialport.getData()

 

مشکل رو رفع کردم :

Q_INVOKABLE QString getData();
public slots:
    
    void emitSignal();

signals:
    void mySignal();

بعد با کد زیر سیگنال readyRead رو به slot ساخته شده متصل کردم

QObject::connect(_serialport,SIGNAL(readyRead()),this,SLOT(emitSignal()));
void serialPort::emitSignal()
{
    emit mySignal();
}
QString serialPort::getData()
{
    QByteArray serialData;
    QString serialBuffer = "";

    serialData = _serialport->readAll();
    serialBuffer = QString::fromStdString(serialData.toStdString());
    qDebug() << serialBuffer;
    return  serialBuffer;
}

کد در qml

    SerialPort
    {
        id:serialport
        onMySignal:
        {
            txtCommunication.append(getData());
        }
    }

فعلا به این شکل رفعش کردم .

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

به نظرم اگر بشه از خود سیگنال readyRead استفاده کنه عالی میشه.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

مهمان
پاسخ به این سوال ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از ۷۵ اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...