Qt小玩意儿——代码雨

效果:
在这里插入图片描述
头文件

#ifndef HACKRAIN_H
#define HACKRAIN_H

#include <QWidget>
#include <QPlainTextEdit>
#include <QTimerEvent>

class HackRain : public QWidget
{
    Q_OBJECT
public:
    explicit HackRain(QWidget *parent = nullptr);
    ~HackRain();

    struct RainText
    {
        RainText() {}

        int startRow = 0;
        int endRow = 0;
        int col = 0;
        int speed = 1;  //下降的速度

        QString text;

        void init(){
            endRow = startRow + text.length() - 1;
        }
    };

protected:
    void initialize();

    RainText getRainLine();
    void getCanAddCol(RainText &rText);
    void updateFrame();

    void timerEvent(QTimerEvent *event);
private:
    QPlainTextEdit *m_pPlaineText = nullptr;
    QVector<RainText> m_vecAllRains;

    int m_nTimerID = -1;
};

#endif // HACKRAIN_H

源文件

#include "hackrain.h"
#include <QVBoxLayout>
#include <QtMath>

HackRain::HackRain(QWidget *parent) : QWidget(parent)
{
    initialize();
}

HackRain::~HackRain()
{
    if(m_nTimerID != -1){
        this->killTimer(m_nTimerID);
    }
}

void HackRain::initialize()
{
    QVBoxLayout *pLayout = new QVBoxLayout;
    m_pPlaineText = new QPlainTextEdit;
    pLayout->addWidget(m_pPlaineText);
    m_pPlaineText->setStyleSheet("QPlainTextEdit{"
                                 "background-color:black;"
                                 "color:green;"
                                 "}");

    this->setLayout(pLayout);
    this->resize(650,650);
    m_pPlaineText->setEnabled(false);

    for (int i = 0; i < 50; ++i) {
        m_vecAllRains.append(getRainLine());
    }

    m_nTimerID = this->startTimer(1000/24);

}

HackRain::RainText HackRain::getRainLine()
{
    QStringList riansTexts;
    riansTexts << "Hello world" << "Yes My baby" << "void main()";

    RainText rText;
    rText.startRow = qrand() % 80;
    rText.text = riansTexts.at(qrand() % 3);
    rText.init();
    getCanAddCol(rText);
    return rText;
}

void HackRain::getCanAddCol(HackRain::RainText &rText)
{
    rText.col = qrand() % 100;
    rText.speed = qrand() % 5 + 1;
    if(m_vecAllRains.count() == 0){
        return;
    }
    bool canAdd = true;
    for(HackRain::RainText t:m_vecAllRains){
        if(t.col == rText.col &&
                t.startRow <= rText.endRow){
            canAdd = false;
            break;
        }
    }
    if(!canAdd){
        getCanAddCol(rText);
    }
}

void HackRain::updateFrame()
{
    m_pPlaineText->clear();
    QString texts;
    if(m_vecAllRains.isEmpty()){
        return;
    }

    for (int r = 0; r < 40; ++r) {
        for (int c = 0; c < 100; ++c) {
            bool isDot = true;
            for(HackRain::RainText rText:m_vecAllRains){
                if(rText.col == c &&
                        (rText.startRow <= r && rText.endRow >= r)){
                    texts.append(rText.text.at(r - rText.startRow));
                    isDot = false;
                    break;
                }
            }
            if(isDot){
                texts.append(".");
            }
        }
        texts += "\n";
    }

    int i = 0;
    for(HackRain::RainText rText:m_vecAllRains){
        rText.startRow += rText.speed;
        if(rText.startRow >= 100){
            rText.startRow = 0;
            rText.init();
            getCanAddCol(rText);
        }else{
            rText.init();
        }
        m_vecAllRains[i] = rText;
        ++i;
    }

    m_pPlaineText->appendPlainText(texts);
}

void HackRain::timerEvent(QTimerEvent *event)
{
    QWidget::timerEvent(event);
    updateFrame();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT5串口编程可以用于编写简单的上位机,通过串口与下位机进行通信。下面是一个简单的上位机编写示例: 首先,要在QT项目中加入串口模块,可以通过在.pro文件中加入以下代码实现: ``` QT += serialport ``` 接下来,创建一个新的类,命名为SerialPort,继承自QObject,并添加以下代码: ```cpp #include "serialport.h" SerialPort::SerialPort(QObject *parent) : QObject(parent) { serial = new QSerialPort(this); connect(serial, &QSerialPort::readyRead, this, &SerialPort::readData); } void SerialPort::openPort(QString portName, qint32 baudRate) { serial->setPortName(portName); serial->setBaudRate(baudRate); if(serial->open(QIODevice::ReadWrite)) { qDebug() << "Serial port is open"; } else { qDebug() << "Serial port failed to open"; } } void SerialPort::closePort() { if(serial->isOpen()) { serial->close(); qDebug() << "Serial port is closed"; } } void SerialPort::readData() { QByteArray data = serial->readAll(); qDebug() << "Received data: " << data; // 在这里可以对接收到的数据进行处理 } void SerialPort::writeData(QByteArray data) { if(serial->isOpen()) { serial->write(data); qDebug() << "Sent data: " << data; } else { qDebug() << "Serial port is not open"; } } ``` 在主窗口中,可以使用SerialPort类的实例来控制串口的打开、关闭和数据的读写,可以通过按钮来触发相应的操作。下面是一个简单的主窗口实现: ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); serialPort = new SerialPort(this); connect(ui->openButton, &QPushButton::clicked, this, &MainWindow::openPort); connect(ui->closeButton, &QPushButton::clicked, this, &MainWindow::closePort); connect(ui->sendButton, &QPushButton::clicked, this, &MainWindow::sendData); } MainWindow::~MainWindow() { delete ui; } void MainWindow::openPort() { QString portName = ui->portComboBox->currentText(); qint32 baudRate = ui->baudRateComboBox->currentText().toInt(); serialPort->openPort(portName, baudRate); } void MainWindow::closePort() { serialPort->closePort(); } void MainWindow::sendData() { QString data = ui->sendLineEdit->text(); serialPort->writeData(data.toUtf8()); ui->sendLineEdit->clear(); } ``` 在QT设计器中,可以创建一个MainWindow窗口,包含一个QComboBox用于选择串口号,一个QComboBox用于选择波特率,一个QLineEdit用于输入发送的数据,以及几个QPushButton用于触发相应的操作。 以上就是一个简单的QT5串口编程的上位机实现,你可以根据具体的需求进行进一步的修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值