关闭

QT界面设计并保存到文件(以JSON格式)

73人阅读 评论(0) 收藏 举报

这两天写了关于QT的界面设计的东西,总之在大家的努力下搞好了。下面是一些主要的代码和思路

首先头文件就不讲了,要包含一大堆头文件,当然还有槽函数,因为我是在点击的时候才保存到文件中的。

下面只讲.cpp文件

    ui(new Ui::xh_Dialog)
{
    ui->setupUi(this);
   // QJsonObject xh_jsonobject;
    QRegExp regx("[0-9]+$");//只能输入1-9
    QValidator *validator = new QRegExpValidator(regx);
    this->ui->xh_lineEdit_1->setValidator( validator );


}
这是我的构造函数我是在构造函数里面写让只能输入数字的lineEdit让他只能输入1-9的数字,输入其他的不行,
setValidator表示设置验证程序,
QValidator 就是一个类库,译为验证器



fileName = QFileDialog::getOpenFileName(this,"OpenFile",QDir::currentPath());
    this->ui->xh_lineEdit_4->setText(fileName);

这是获得图片的路径,然后把它设置到xh_lineEdit_4


 QJsonObject xh_jsonobject;
    xh_jsonobject.insert("ScnceName",ui->xh_lineEdit->text());
    xh_jsonobject.insert("ScnceNum",ui->xh_lineEdit_1->text().toInt());
    QStringList list =  this->ui->xh_lineEdit_4->text().split("/");//分割字符串
        QString xh_filename = list.at(list.size() - 1);

    xh_jsonobject.insert("Bg_pic",xh_filename);

QJsonObject  创建的是JSON类型的对象  
xh_jsonobject.insert 这是对象的插入格式,前面的是对象后面的对象的值。其中的.toInt()是将文本转化成int类型的。


这里总结一下一般在QT里面的设置类型都是在类型前面加.to

后面的.split表示的是分割字符串,这里是以“/”分割的,因为我是在Windows下写的所以这里是以“/”进行分割,要是你在Linux下面写的就是相反的,以"\"分割,后面我是想只获得图片的名字,他的路径我不获取,所以就是List.size() -1

这里我从网上找到了一个很好的解释


QString str = "a#b#c";
QStringList list =str.split("#");//查找#符号,然后分离存入list。list: [ "a", "b", "c" ];
QStringList flieName=list.at(0),//就是取刚才存入的队列的字符,list.at(0)就是a。- -!
这些看Qt的帮助文档都可以看- -
    QJsonDocument xh_document;
    xh_document.setObject(xh_jsonobject);
    QByteArray xh_byte_arry = xh_document.toJson(QJsonDocument::Compact);
    QString xh_json_str(xh_byte_arry);
这是生成QJSON的文档,然后把我的JSON对象插入进去,QbyteArray是进行深度拷贝,然后再将我拷贝的东西转化成Qstring类型的(也就是字符串类型的),放在xh_json_strz里面,(这里因为是菜鸟所以起名就没有很大的注意。见谅见谅)


    QDir dir(QDir::currentPath()+"/UI/background/");
    dir.mkpath(QDir::currentPath()+"/UI/background/");//创建多级目录
    QFile file("./UI/background/"+xh_filename);
QDir是创建多级目录QDir::currentPath()表示的是当前的目录,然后再当前的目录下创建我命名的文件名,注意这里是多级的,Qfile是单级的我这里是想用我上面截取的图片的名字来进行命名我所需要的文件

    QFile::copy(this->ui->xh_lineEdit_4->text(),QDir::currentPath()+"/UI/background/"+xh_filename);

这里是将我获得的图片的路径(因为我是将他显示在xh_lineEdit_4上面了)拷贝到我之前命名的文件中去

    file.setFileName("./UI/scene/scene.dat");
    bool ok=file.open(QIODevice::WriteOnly|QIODevice::Append);
    QFile::copy(this->ui->xh_lineEdit_4->text(),QDir::currentPath()+"/UI/scene/"+xh_filename);
    if(ok)
    {
        QTextStream out(&file);
        out<<xh_json_str<<endl;
        out<<xh_byte_arry_1<<endl;



        file.close();
    }

这里我有创建了一个文件,是为了存储我的数据,然后用bool z类型额OK判断有没有打开成功,这里注意QIODecice::writeOnly|QIODevice::Append,是每次只写文件中的的一行,因为智力有一个append所以之前的写的数据是不会被覆盖的,然后再将之前写的图片也放到我现在的文件夹里面,如果成功,QTextStream out是写入这个文件,相反QtextStresm in就是读出,这里概念可能与我们平常理解的相反,但是没事,并不妨碍我们去用他,然后将我之前创建的并且已经插入好的QJSON类型的对象写入到里面,再将文件关闭。

    int ret = QMessageBox::information(this,"information","是否保存",QMessageBox::Yes|QMessageBox:: No);

    if(ret == QMessageBox::Yes)
    {

        clear();
    }

这里我用QmessageBox提示是否保存,如果是Yes就将之前界面写的东西clear()掉,这里我的clear()也是一个函数。

void xh_Dialog::clear()
{
    this->ui->xh_lineEdit->clear();
    this->ui->xh_lineEdit_1->clear();
    this->ui->xh_lineEdit2->clear();
    this->ui->xh_lineEdit3->clear();
    this->ui->xh_lineEdit_4->clear();

}


这里我有写了一个函数,是为了实现有些东西每填的话是不能保存的

bool xh_Dialog::isNULL()
{
    if(this->ui->xh_lineEdit->text().isEmpty())
    {
        QMessageBox::warning(this,"警告","场景名称不能为空");

        return false;
    }else if(this->ui->xh_lineEdit_1->text().isEmpty())
    {
        QMessageBox::warning(this,"警告","场景号不能为空");
        return false;
    }
    else
    {
        return true;
    }

}



我用的都是Qmessage,注意这里都是又返回值的,就是为了之后的使用。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:128次
    • 积分:21
    • 等级:
    • 排名:千里之外
    • 原创:0篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档