QT开发中文网

采用qt代码实现的功能:初始界面显示udp通信连接,只有当bind成功才能跳转到主界面,同时采用继承object类的线程qthread线程接收数据,并将数据在主界面qcustomplot中显示图像

以下是一个基本的UDP通信连接和线程接收数据并在QCustomPlot中绘制图像的示例代码:

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QUdpSocket>
#include "mythread.h"
#include "qcustomplot.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_btnConnect_clicked();
    void onThreadFinished();

private:
    Ui::MainWindow *ui;
    QUdpSocket *udpSocket;
    MyThread *thread;
};

#endif // MAINWINDOW_H

mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    udpSocket = new QUdpSocket(this);
}

MainWindow::~MainWindow()
{
    delete ui;

    if (thread != nullptr && thread->isRunning())
        thread->stop();
}

void MainWindow::on_btnConnect_clicked()
{
    QString host = ui->lineEditHost->text();
    quint16 port = ui->spinBoxPort->value();

    if (udpSocket->bind(QHostAddress(host), port))
        {
            thread = new MyThread(udpSocket, this);
            connect(thread, SIGNAL(finished()), this, SLOT(onThreadFinished()));
            thread->start();

            ui->stackedWidget->setCurrentIndex(1); // switch to main page
        }
        else
        {
            QMessageBox::warning(this, tr("Connection Error"), tr("Failed to bind UDP socket."));
        }
}

void MainWindow::onThreadFinished()
{
    QMessageBox::warning(this, tr("Error"), tr("An error occurred in the thread."));
    ui->stackedWidget->setCurrentIndex(0); // switch back to connect page
}

mythread.h:

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>
#include <QUdpSocket>
#include "qcustomplot.h"

class MyThread : public QThread
{
    Q_OBJECT

public:
    explicit MyThread(QUdpSocket *socket, QObject *parent = nullptr);
    void stop();

protected:
    void run() override;

signals:
    void finished();

private:
    QUdpSocket *udpSocket;
    bool stopped;
};

#endif // MYTHREAD_H

mythread.cpp:

#include "mythread.h"

MyThread::MyThread(QUdpSocket *socket, QObject *parent) :
    QThread(parent),
    udpSocket(socket),
    stopped(false)
{
}

void MyThread::stop()
{
    stopped = true;
}

void MyThread::run()
{
    QCPCurveDataMap dataMap;
    
    while (!stopped)
        {
            if (udpSocket->hasPendingDatagrams())
                {
                    QByteArray datagram;
                    datagram.resize(udpSocket->pendingDatagramSize());
                    udpSocket->readDatagram(datagram.data(), datagram.size());

                    QString strData(datagram);

                    QStringList list = strData.split(",");

                    double xValue = list[0].toDouble();
                    double yValue = list[1].toDouble();

                    dataMap.insert(xValue, QCPCurveData(xValue, yValue));
                    
                    emit dataReceived(dataMap); // signal to main window to update plot
                }

            msleep(10);
        }

   emit finished();
}

在主界面的QCustomPlot中,您可以使用以下代码更新绘图:

connect(thread, SIGNAL(dataReceived(QCPCurveDataMap)), this, SLOT(updatePlot(QCPCurveDataMap)));

void MainWindow::updatePlot(const QCPCurveDataMap &data)
{
    ui->customPlot->graph(0)->data()->set(data);
    ui->customPlot->replot();
}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=2581

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?