越南网站 后缀,芜湖商城网站建设,海安市建设局网站,公司网站设【 声明#xff1a;版权所有#xff0c;欢迎转载#xff0c;请勿用于商业用途。 联系信箱#xff1a;feixiaoxing 163.com】 前面我们学习了ini文件的解析办法#xff0c;通过QSettings类就可以很轻松地访问ini文件里面的数据。除了ini文件之外#xff0c;另外一种经常出…【 声明版权所有欢迎转载请勿用于商业用途。 联系信箱feixiaoxing 163.com】 前面我们学习了ini文件的解析办法通过QSettings类就可以很轻松地访问ini文件里面的数据。除了ini文件之外另外一种经常出现的文件格式其实是json格式。一般来说如果读写的数据不是很多那么完全可以用json文件替换成数据库实现数据的保存和加载工作。今天我们通过编写一个会员管理软件的办法正好学习下qt下面如何进行json数据的处理。当然还可以借助这个小项目多了解一下qt下面不同控件的用法和写法。 1、设计界面 如果界面上的控件比较少可以直接用c语言编写没有问题。但是如果控件比较多的话那么建议还是用designer来进行设计。本次编写的会员管理软件控件的数量稍微有点多正好可以借这个机会把designer练一练。 练习的过程当中我们也发现部分控件存在着排列层次的关系。比如左侧的operation如果是后面加上去的没有把它放到单选框、标签、输入框的最下面那么生成窗口之后其实不管是radioButton、还是textBox都是没有办法进行输入的。这一点可能需要稍微注意下。另外整个界面是删除菜单栏、工具栏和状态栏的。 2、QtWidgetsApplication.h头文件 头文件中需要注意的部分主要就是各个控件的回调函数。这里面有radioButton的回调函数、按钮的回调函数。其中radioButton虽然是4个但是可以看成是一组这样可以少写3个回调函数编写上面比较方便一点。当然除了界面之外关联的业务数据也要根据实际情况及时添加上。
#pragma once#include string
#include vector
using namespace std;#include QtWidgets/QMainWindow
#include ui_QtWidgetsApplication.hclass QtWidgetsApplication : public QMainWindow
{Q_OBJECTpublic:QtWidgetsApplication(QWidget *parent nullptr);~QtWidgetsApplication();private:Ui::QtWidgetsApplicationClass ui;int mode_;int max_number_;vectorint id_array_;vectorstring name_array_;private:int findDataById(int id);void updateData();void loadFile();private:void onRadioButtonToggled(bool checked);void onOkClicked();void onCancelClicked();void onSaveClicked();};3、QtWidgetsApplication.cpp文件设计 到目前为止这个cpp文件算得上是目前qt项目代码行数最多的文件主要也是因为功能要求比较多。首先它包含了基本的构造函数和析构函数。构造函数里面最主要的部分就是把控件和它的回调函数关联在一起。其次代码中涉及到json数据的加载和保存。和c# wpf不同qt本身有相关的类来处理这些数据。最后就是业务逻辑。业务逻辑一般比较复杂、麻烦一点编写之前最好想清楚比如插入数据的时候是不是需要检查一下是不是有同名id删除的时候是不是考虑存在找不到的情况。crud的处理方式虽然比较简单但是涉及到业务层面还是要想清楚、搞明白中间出错都没有关系但是可以通过这个crud来提高自己的业务分析能力也是不错的一种方式。 另外因为测试的时候涉及到了data.json文件这部分大家可以先参考这个模板。将来使用的话可以在这个模板之上进一步去拓展和延申
{count: 6,items: [{ID: 1,NAME: abcde},{ID: 2,NAME: bbb},{ID: 3,NAME: ccc},{ID: 5,NAME: ddd},{ID: 6,NAME: eee},{ID: 4,NAME: fff}]
}和ini文件一样这个json文件也需要保存在h文件、cpp文件目录下面。最后还是给出完整的cpp代码虽然内容多了一点但还是比较有借鉴意义的可以耐心地去看一看、分析下。
#include QDebug
#include QFile
#include QJsonDocument
#include QJsonObject
#include QJsonValue
#include QJsonArray
#include QMessageBox
#include QtWidgetsApplication.hQtWidgetsApplication::QtWidgetsApplication(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);mode_ 1; // addmax_number_ 100; // maximum number is 100ui.radioButton1-setChecked(true); // first radio button is checked right nowloadFile(); // load data from json fileconnect(ui.radioButton1, QRadioButton::toggled, this, QtWidgetsApplication::onRadioButtonToggled);connect(ui.radioButton2, QRadioButton::toggled, this, QtWidgetsApplication::onRadioButtonToggled);connect(ui.radioButton3, QRadioButton::toggled, this, QtWidgetsApplication::onRadioButtonToggled);connect(ui.radioButton4, QRadioButton::toggled, this, QtWidgetsApplication::onRadioButtonToggled);connect(ui.pushButton1, QPushButton::clicked, this, QtWidgetsApplication::onOkClicked);connect(ui.pushButton2, QPushButton::clicked, this, QtWidgetsApplication::onCancelClicked);connect(ui.pushButton3, QPushButton::clicked, this, QtWidgetsApplication::onSaveClicked);updateData();
}QtWidgetsApplication::~QtWidgetsApplication()
{}void QtWidgetsApplication::onRadioButtonToggled(bool checked)
{if (checked) {if (sender() ui.radioButton1){mode_ 1;ui.lineEdit2-setEnabled(true);}else if (sender() ui.radioButton2){mode_ 2;ui.lineEdit2-setEnabled(false);}else if (sender() ui.radioButton3){mode_ 3;ui.lineEdit2-setEnabled(true);}else if (sender() ui.radioButton4){mode_ 4;ui.lineEdit2-setEnabled(false);}else{qDebug() Unknown option was selected;}}
}void QtWidgetsApplication::onOkClicked()
{int id;string name;int pos;bool conversionOK;switch (mode_){case 1: //addif (ui.lineEdit1-text() ){QMessageBox::information(nullptr, Tips, Id is empty!);return;}if (ui.lineEdit2-text() ){QMessageBox::information(nullptr, Tips, Name is empty!);return;}if (id_array_.size() max_number_){QMessageBox::information(nullptr, Tips, Buffer is full!);return;}id ui.lineEdit1-text().toInt(conversionOK);if (findDataById(id) ! -1){QMessageBox::information(nullptr, Tips, Id already existed!);return;}name ui.lineEdit2-text().toStdString();id_array_.push_back(id);name_array_.push_back(name);QMessageBox::information(nullptr, Tips, Successfully add data!);updateData();ui.lineEdit1-setText();ui.lineEdit2-setText();break;case 2://delif (ui.lineEdit1-text() ){QMessageBox::information(nullptr, Tips, Id is empty!);return;}id ui.lineEdit1-text().toInt(conversionOK);pos findDataById(id);if(pos -1){QMessageBox::information(nullptr, Tips, Specified Id does not existed!);return;}id_array_.erase(id_array_.begin() pos);name_array_.erase(name_array_.begin() pos);QMessageBox::information(nullptr, Tips, Successfully del data!);updateData();ui.lineEdit1-setText();ui.lineEdit2-setText();break;case 3:// updateif (ui.lineEdit1-text() ){QMessageBox::information(nullptr, Tips, Id is empty!);return;}if (ui.lineEdit2-text() ){QMessageBox::information(nullptr, Tips, Name is empty!);return;}id ui.lineEdit1-text().toInt(conversionOK);pos findDataById(id);if(pos -1){QMessageBox::information(nullptr, Tips, Specified Id does not existed!);return;}name ui.lineEdit2-text().toStdString();name_array_[pos] name;QMessageBox::information(nullptr, Tips, Successfully update data!);updateData();ui.lineEdit1-setText();ui.lineEdit2-setText();break;case 4: // searchif (ui.lineEdit1-text() ){QMessageBox::information(nullptr, Tips, Id is empty!);return;}id ui.lineEdit1-text().toInt(conversionOK);pos findDataById(id);if (pos -1){QMessageBox::information(nullptr, Tips, Specified Id does not existed!);return;}name name_array_[pos];ui.lineEdit1-setText();ui.lineEdit2-setText();QMessageBox::information(nullptr, Tips, QString::fromStdString(string(Name is ) name string(!)));break;default:break;}
}void QtWidgetsApplication::onCancelClicked()
{this-close();
}void QtWidgetsApplication::onSaveClicked()
{QJsonArray itemsArray;// save data to itemsArrayfor (int i 0; i id_array_.size(); i) {QJsonObject itemObject;itemObject[ID] id_array_[i];itemObject[NAME] QString::fromStdString(name_array_[i]);itemsArray.append(itemObject);}// create jsonObjectQJsonObject jsonObject;jsonObject[count] itemsArray.size();jsonObject[items] itemsArray;// transfer to jsonDocuentQJsonDocument jsonDocument(jsonObject);// save to json fileQFile file(data.json);if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {file.write(jsonDocument.toJson());file.close();QMessageBox::information(nullptr, Tips, Successfully save the json file!);}else {qDebug() Failed to save JSON file;}
}void QtWidgetsApplication::loadFile()
{QFile file(data.json);if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {qDebug() Failed to open JSON file;return;}QByteArray jsonData file.readAll();file.close();QJsonDocument jsonDocument QJsonDocument::fromJson(jsonData);if (jsonDocument.isNull()) {qDebug() Failed to create JSON document;return;}QJsonObject jsonObject jsonDocument.object();int num jsonObject[count].toInt();// get itemsQJsonArray itemsArray jsonObject[items].toArray();// read data from itemsfor (int i 0; i itemsArray.size(); i) {QJsonValue itemValue itemsArray.at(i);if (itemValue.isObject()) {QJsonObject itemObject itemValue.toObject();// read dataint id itemObject[ID].toInt();QString name itemObject[NAME].toString();id_array_.push_back(id);name_array_.push_back(name.toStdString());}}
}int QtWidgetsApplication::findDataById(int id)
{int i;for (i 0; i id_array_.size(); i){if (id_array_[i] id){return i;}}return -1;
}void QtWidgetsApplication::updateData()
{string s ;int i;for (i 0; i id_array_.size(); i){s std::to_string(id_array_[i]);s ;s name_array_[i];s \n;}ui.textEdit1-setPlainText();ui.textEdit1-setPlainText(QString::fromStdString(s));}4、测试和验证 相比较而言测试和验证就容易得多。首先加载的时候看看json数据有没有全部加载到界界面里面。其次看下增删改查的功能是否正常。如果一切都没有问题那就基本ok了。有问题的话单步去调试即可。