رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران
  • 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 استفاده کنه عالی میشه.

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


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

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

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

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری

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

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

×