提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
记录一下在嵌入式液晶屏UI程序上添加弹窗功能
一、需求
将接收到的Json数据中的字符串数组解析出来显示在弹窗里
二、使用步骤
1.Qt解析cJSON数据
cJSON *json;
cJSON *json_DialogSta;
cJSON *json_Dialog_array;
int num_DialogSta = 0;
int json_Dialog_array_size =0;
cJSON *json_Dialog_array_item = NULL;
QString str_Dialog_array;
//解析json
json = cJSON_Parse((char*) data );
char* parse_error = (char *)cJSON_GetErrorPtr();
if( json == NULL ){
return;
}
json_DialogSta = cJSON_GetObjectItem(json,"DialogSta");
if(NULL != json_DialogSta)
{
if(json_DialogSta->type == cJSON_Number);
num_DialogSta = json_DialogSta->valueint;
}
if(num_DialogSta){
json_Dialog_array =cJSON_GetObjectItem(json, "DialogStr");
json_Dialog_array_size = cJSON_GetArraySize(json_Dialog_array);
for(int i=0;i<json_Dialog_array_size;i++)
{
//将传过来的JSON字符串数组解析成QString
json_Dialog_array_item = cJSON_GetArrayItem(json_Dialog_array,i);
str_Dialog_array = str_Dialog_array.fromLocal8Bit(json_Dialog_array_item->valuestring);
//发送到主线程
emit sedarray(str_Dialog_array,json_Dialog_array_size);
}
}
cJSON_Delete (json);
//发送到主线程
emit seddialogmsg(num_DialogSta);
2.接收字符串数组并显示
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
initdlg();
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
connect(this,SIGNAL(seddialogmsg(int)),this,SLOT(resdialogmsg(int)));
connect(this,SIGNAL(sedarray(QString,int)),this,SLOT(resarray(QString,int)));
}
//设置弹窗样式
void Widget::initdlg()
{
dlg = new QDialog();
title = new QWidget();
edit = new QTextEdit();
lab = new QLabel();
dlg->setWindowFlags(Qt::FramelessWindowHint);
QGridLayout *lay = new QGridLayout();
QVBoxLayout *laym = new QVBoxLayout();
QPushButton *btn = new QPushButton();
QImage *img = new QImage();
dlg->setStyleSheet("background-color:rgb(255,255,255);border-style:solid;border-width:2;border-color:rgb(0,129,255)");
title->setStyleSheet("background-color:rgb(0,129,255)");
img->load(":/image/2.png");
img->scaled(lab->size(),Qt::KeepAspectRatio);
img->scaled(lab->size(),Qt::IgnoreAspectRatio);
lab->setScaledContents(true);
lab->setPixmap(QPixmap::fromImage(*img));
btn->setFlat(true);
edit->setStyleSheet("border-width:0;border-style:outset;color:red");
edit->setFontPointSize(18);
btn->setStyleSheet("color:red");
btn->setText(tr("警告"));
lay->addWidget(la,0,0,1,1);
lay->addWidget(btn,0,1,1,9);
lay->setMargin(0);
lay->setSpacing(0);
btn->setMaximumHeight(30);
lab->setMaximumHeight(30);
lab->setMaximumWidth(30);
title->setMaximumHeight(30);
title->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Maximum);
title->setLayout(lay);
laym->addWidget(title);
laym->addSpacerItem(new QSpacerItem(20,40));
laym->addWidget(edit);
laym->setStretchFactor(title,1);
laym->setStretchFactor(title,4);
laym->setStretchFactor(edit,5);
laym->setMargin(2);
laym->setSpacing(0);
dlg->setLayout(laym);
dlg->resize(300,200);
dlg->setAttribute(Qt::WA_ShowWithoutActivating,true);//设置弹窗不获取焦点
}
//edit根据传过来的数组成员数 动态分行显示字符串数组
void Widget::resarray(QString text,int num)
{
edit->document()->setMaximumBlockCount(num);
edit->append(text);
edit->setAlignment(Qt::AlignHCenter);
}
//弹窗的关闭和显示
void Widget::resdialogmsg(int value)
{
if(value == 1)
{
dlg->show();
qDebug()<<"dlg is show";
}
if(value == 0)
{
edit->clear();
dlg->close();
qDebug()<<"dlg is close";
}
}
总结
在window上做弹窗其实很简单,在嵌入式设备上使用时就遇到了一些小问题。需要做一个弹窗显示警告信息,在弹窗存在时主界面仍旧要可以操作,弹窗的关闭和显示也需要根据主界面的信息来判断。最终解决了问题,记录一下