QT 實現串口調試和時間顯示功能

  1. 運行效果
    QT串口調試時間顯示圖片
    在這裏插入圖片描述
  2. widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSerialPortInfo>
#include <QSerialPort>
#include <QDebug>
#include <QTextCodec>
#include <QMessageBox>
#include <QImage>
#include <QPixmap>
#include <QTimer>
#include <QDateTime>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_OpenCom_clicked();  //打開串口按鈕
    void timeUpdate();

private:
    Ui::Widget *ui;
    QSerialPort *serial;
    QTimer *timer;

};
#endif // WIDGET_H
  1. widget.cpp
#include "widget.h"
#include "ui_widget.h"

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

    //界面的構造函數,我們一般完成的是界面部分的初始化代碼

    //遍歷查詢可使用的串口
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
        QSerialPort serial;
        serial.setPort(info);
        if(serial.open(QIODevice::ReadWrite)){
            ui->ComBox->addItem(serial.portName());
            serial.close();
        }
    }

    //設置波特率下拉菜單默認顯示第一項
    ui->BaudBox->setCurrentIndex(0);

    QString imgname("D:\\QtCode\\SerialDemo\\close.PNG");
    QImage *img = new QImage;
    if(!img->load(imgname))//加載圖像
    {
        QMessageBox::information(this,tr("打開圖像失敗"),tr("打開圖像失敗"));
        delete img;
        return;
    }
    ui->lbl_img->setPixmap(QPixmap::fromImage(*img));

    //定時器
    timer = new QTimer(this);
    //關聯定時器與槽函數
    connect(timer, SIGNAL(timeout()),this, SLOT(timeUpdate()));
    //timeout()時間溢出信號函數

    //開啓定時器
    timer->start(1000);


}


Widget::~Widget()
{
    delete ui;
}

//打開串口按鈕
void Widget::on_OpenCom_clicked()
{

    //判斷是否是打開信息
    if(ui->OpenCom->text()=="打開串口"){

        serial = new QSerialPort;
        //設置串口名
        serial->setPortName(ui->ComBox->currentText());
        //打開串口
        serial->open(QIODevice::ReadWrite);

        //設置波特率
        serial->setBaudRate(ui->BaudBox->currentText().toInt());
        //設置數據位
        switch (ui->DataBitBox->currentIndex()) {

            case 8:
                serial->setDataBits(QSerialPort::Data8);
                break;
            default:
                break;
        }
        //設置校驗位
        serial->setParity(QSerialPort::NoParity);
        //設置停止位
        serial->setStopBits(QSerialPort::OneStop);
        //設置控制流
        serial->setFlowControl(QSerialPort::NoFlowControl);

        //提示信息的變更
        ui->OpenCom->setText("關閉串口");

        //設置打開後選項的不可用
        ui->ComBox->setEnabled(false);
        ui->BaudBox->setEnabled(false);
        ui->DataBitBox->setEnabled(false);
        ui->ParityBox->setEnabled(false);
        ui->StopBox->setEnabled(false);


        QString imgname("D:\\QtCode\\SerialDemo\\open.PNG");
        QImage *img = new QImage;
        if(!img->load(imgname))//加載圖像
        {
            QMessageBox::information(this,tr("打開圖像失敗"),tr("打開圖像失敗"));
            delete img;
            return;
        }
        ui->lbl_img->setPixmap(QPixmap::fromImage(*img));


        //建立信號與槽函數的關聯
        connect(serial, SIGNAL(readyRead()), this, SLOT(readData()));

    }
    else{
        //關閉串口
        serial->clear();//清除serial對象中的串口信息
        serial->close();//關閉串口設備
        serial->deleteLater();

        //ui->OpenCom->setText(QString::fromLocal8Bit("打開串口"));
        ui->OpenCom->setText(" 打開串口");

        //設置關閉後選項的可用
        ui->ComBox->setEnabled(true);
        ui->BaudBox->setEnabled(true);
        ui->DataBitBox->setEnabled(true);
        ui->ParityBox->setEnabled(true);
        ui->StopBox->setEnabled(true);


        QString imgname("D:\\QtCode\\SerialDemo\\close.PNG");
        QImage *img = new QImage;
        if(!img->load(imgname))//加載圖像
        {
            QMessageBox::information(this,tr("打開圖像失敗"),tr("打開圖像失敗"));
            delete img;
            return;
        }
        ui->lbl_img->setPixmap(QPixmap::fromImage(*img));

    }

}

void Widget::timeUpdate()//時間的更新函數
{
    //currentDateTime() 可以獲取當前系統時間
    QDateTime time = QDateTime::currentDateTime();
    //將時間對面按照一定的格式轉換爲字符串對象
    QString str = time.toString("yyyy/MM/dd hh:mm:ss dddd");
    ui->time_edit->setText(str);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章