2021-02-07

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

记录一下在嵌入式液晶屏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上做弹窗其实很简单,在嵌入式设备上使用时就遇到了一些小问题。需要做一个弹窗显示警告信息,在弹窗存在时主界面仍旧要可以操作,弹窗的关闭和显示也需要根据主界面的信息来判断。最终解决了问题,记录一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值