工程源码:https://github.com/zhangfls/QT_UartAnalysisTool
上一篇:QT实现串口调试助手(三)
一、主题设置功能
1、初始化菜单栏
QMenuBar *menuBar = ui->menuBar;
QMenu *pFile = menuBar->addMenu("主题设置");
2、将QSS样式文件放在一个指定文件夹下,比如文件夹名为qss
3、查找过滤文件
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、根据查找到的文件,生成菜单栏的目录
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、上面目录connect调用的更新样式的方法:
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、这样就可以生成主题设置的功能目录了,点击不同项可以切换主题。当然目录名称可以再优化一下
扫描二维码关注公众号,回复:
12958569 查看本文章
二、创建缓存的命令列表菜单
1、在界面上放一个table Widget
2、初始化table
//初始化命令列表
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、处理每个命令对应的发送按钮
//发送数据
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、这样就可以生成对应的命令面板了,点击按钮,就可以发送对应数据plain里的内容了
下一篇: