QT implementa el asistente de depuración en serie (4): tema de configuración de QSS, agregando una lista de comandos de acceso directo

Código fuente del proyecto: https://github.com/zhangfls/QT_UartAnalysisTool

 

Publicación anterior: QT realiza el asistente de depuración del puerto serie (3)

 

1. Función de configuración de tema

1. Inicialice la barra de menú

    QMenuBar *menuBar = ui->menuBar;
    QMenu *pFile = menuBar->addMenu("主题设置");

2. Coloque el archivo de estilo QSS en una carpeta designada, por ejemplo, el nombre de la carpeta es qss

3. Busque el archivo de filtro

    QDir dir1("/qss/");
    QFileInfoList list;
    QStringList filters;
    if(dir1.exists())
    {
        dir1.setFilter(QDir::Files); //加过滤器,选择后缀为qss的文件
        filters << "*qss";
        dir1.setNameFilters(filters);
        list = dir1.entryInfoList();
    }
    else
    {
        qDebug()<<"qss不在盘根目录";
        QDir dir2("qss/");
        if(dir2.exists())
        {
            dir2.setFilter(QDir::Files); //加过滤器,选择后缀为qss的文件
            dir2.setNameFilters(filters);
            list = dir2.entryInfoList();
        }
        else
        {
            qDebug()<<"qss不在程序根目录";
        }
    }

4. De acuerdo con los archivos encontrados, genere el directorio de la barra de menú.

    if(list.size()>1)
    {
        QFileInfo fileInfo;
        QList<QAction*> actions;
        foreach (fileInfo, list)
        {
            qDebug()<<fileInfo.fileName();
            actions.append(new QAction(fileInfo.fileName()));
        }
        for(QAction *ac:actions)
        {
            pFile->addActions(actions);
            connect(ac,&QAction::triggered,
                        [=] ()
                        {
                            updateMainStyle(ac->text());
                        }
                        );
        }
    }

5. El método de actualización del estilo llamado por el directorio anterior se conecta:

void MainWindow::updateMainStyle(QString style)
{
    //QSS文件初始化界面样式
    QFile qss("qss/"+style);
    if(qss.open(QFile::ReadOnly))
    {
        qDebug()<<"qss load";
        QTextStream filetext(&qss);
        QString stylesheet = filetext.readAll();
        this->setStyleSheet(stylesheet);
        qss.close();
    }
    else
    {
        qDebug()<<"qss not load";
        qss.setFileName("/qss/"+style);
        if(qss.open(QFile::ReadOnly))
        {
            qDebug()<<"qss load";
            QTextStream filetext(&qss);
            QString stylesheet = filetext.readAll();
            this->setStyleSheet(stylesheet);
            qss.close();
        }
    }
}

6. De esta manera, se puede generar un catálogo funcional de configuraciones de temas y puede cambiar de tema haciendo clic en diferentes elementos. Por supuesto, el nombre del directorio se puede optimizar

Dos, crear un menú de lista de comandos de caché

1. Coloque un widget de mesa en la interfaz

2. Inicializa la tabla

//初始化命令列表
void MainWindow::CmdListInit()
{
    QStringList headerText;
    headerText<<"HEX"<<"数据"<<"发送";
    ui->tableWidget->setColumnCount(headerText.count());

    for(int i = 0;i<headerText.count();i++)
    {
        ui->tableWidget->setHorizontalHeaderItem(i,new QTableWidgetItem(headerText.at(i)));
    }

    ui->tableWidget->setColumnWidth(0,30);
    ui->tableWidget->setColumnWidth(1,200);
    ui->tableWidget->setColumnWidth(2,60);

    for(int i=0;i<100;i++)
    {
        ui->tableWidget->insertRow(i);

        QCheckBox *box = new QCheckBox();
        ui->tableWidget->setCellWidget(i,0,box);

        QLineEdit *line = new QLineEdit();
        ui->tableWidget->setCellWidget(i,1,line);

        QPushButton *button = new QPushButton();
        button->setText("点击");
        ui->tableWidget->setCellWidget(i,2,button);
        connect(button,&QPushButton::clicked,
                    [=] ()
                    {
                        sendButtonClick(line->text());
                    }
                    );
    }
}

3. Procesar el botón de envío correspondiente a cada comando.

//发送数据
void MainWindow::sendButtonClick(QString command)
{
    //未打开串口则不准发送
    if(ui->openSerialButton->text() == "打开串口")
    {
        QMessageBox::warning(NULL, "警告", "未打开可用串口,无法发送数据!\r\n\r\n");
        return;
    }

    //获取发送的命令,并选择在结尾加上换行,AT的命令结尾必须有回车换行
    if(ui->changeLineCheckBox->isChecked())
    {
        command += "\r\n";
    }

    if(ui->timeZoneCheckBox->isChecked())
    {
         curDateTime = QDateTime::currentDateTime();
         ui->uartReadPlain->insertPlainText("\r\n"+curDateTime.toString("[yyyy-MM-dd hh:mm:ss]")+"SEND:"+command);
    }

    send_buf_len += command.length();
    ui->TXLenLabel->setText(QString::number(send_buf_len)+"bytes");

    serial->write(command.toLatin1());
}

4. De esta manera, se puede generar el panel de comando correspondiente, hacer clic en el botón y se puede enviar el contenido en el plano de datos correspondiente

 

Próximo:

QT realiza el asistente de depuración del puerto serie (5): acceso al archivo ini a la información del puerto serie

Supongo que te gusta

Origin blog.csdn.net/zhangfls/article/details/110222800
Recomendado
Clasificación