QTableWidget添加Spinbox、ComboBox,ComboBox下拉项目添加Tip提示等

1 前言

  最近做了一个对Json文件进行属性键值增删、修改的小工具。这里总结一下遇到的一些较为麻烦的问题,以及踩过的一些坑,方便自己回顾。也希望能让需要的人可以少绕些弯路。工具(如下图)主要功能为:读取路径下所有Json文件,并将所有Json文件文件名显示至QListWidget,单击QlistWidget中的Json文件时显示Json文件具体数据至QtableWidget,右键增删属性行,对Json文件中的数据进行修改后进行保存。下拉框中的属性名称由Json文件读入。

QTableWidget添加Spinbox、ComboBox,ComboBox下拉项目添加Tip提示等

2 问题总结

(1)QTableWidget指定行列添加TableWidgetItem?

ui->tableWidget->setItem(Row,Column,new QTableWidgetItem(QString itemName));//itemName为需要显示的内容

(2)判断鼠标是否在QTableWidget内,进行右键操作事件?

///右键菜单显示
void DisJsonParam::contextMenuEvent(QContextMenuEvent *event)
{
    QPoint i = ui->tableWidget->mapFromGlobal(event->globalPos());
    QRect rect(QPoint(0, 0), ui->tableWidget->size());
    if (rect.contains(i))
    {
        _tableWidgetMenu->exec(event->globalPos());
    }
 }

(3)QTableWidget右键插入行,删除行?//与(2)一同组成右键增删行功能

 QMenu *_tableWidgetMenu = nullptr;
QAction *addProperty = new QAction("add Property", this); QAction *delProperty = new QAction("del Property", this);
 _tableWidgetMenu ->addAction(addProperty); 
_tableWidgetMenu->addAction(delProperty);
connect(addProperty, &QAction::triggered, this, &DisJsonParam::addPropertyClicked);
connect(delProperty, &QAction::triggered, this, &DisJsonParam::delPropertyClicked);
 void DisJsonParam::delPropertyClicked()
 {
     ui->tableWidget->removeRow(rowIndex);//RowIndex为需要移除的行数
 }    
 void DisJsonParam::addPropertyClicked()
 {
         int row = ui->tableWidget->rowCount();
         ui->tableWidget->insertRow(row);//在最后一行底部插入
 }

(4)QListWidget显示某路径下特定格式文件的所有文件名?

void DisJsonParam::listJsonFiles()
{
    if(_folderPath.isEmpty())//_folderPath为文件所在路径
    {
        QMessageBox::information(this,"提示","路径错误!");
        return;
    }
    QDir dir = QFileInfo(_folderPath).absolutePath();
    //QFileInfoList infoList = dir.entryInfoList(QDir::Files);//与addItems搭配使用
    ui->listWidget->clear();
    QStringList list = dir.entryList();
    QString jsonName;
    for (int index = 0; index < list.size(); index++)
    {
        jsonName = list.at(index);
        QFileInfo fileinfo = QFileInfo(jsonName);
        QString suffix = fileinfo.suffix();
        if (suffix == "json")//指定格式文件过滤
        {
            ui->listWidget->addItem(jsonName);
       }
    }
    //ui->listWidget->addItems(list);//可一次性将文件列表显示出来 但会包含其它格式的文件
}

(5)关闭软件界面或切换文件时询问是否保存修改后的文件?

///若tablewidget发生修改 则在切换json文件或退出widget时询问是否将修改后的数据写入json文件
void DisJsonParam::saveJsonObj2JsonFile()
{
    if(changedFlag)
    {
        QMessageBox::StandardButton selectKey;
        selectKey = QMessageBox::question(this, "提示", "文件已被修改,是否保存修改?",
                          QMessageBox::Yes|QMessageBox::No,
                          QMessageBox::NoButton);
        if (selectKey==QMessageBox::Yes)
        {
            QJsonDocument jsonDoc(_currentJsonObj);
            QString jsonString = jsonDoc.toJson();
            QFile saveFile(_folderPath + _currentFileName);

            if(!saveFile.open(QIODevice::WriteOnly))
            {
                QMessageBox::information(this,"提示","无法保存Json文件");
                return;
            }
            saveFile.write(jsonString.toLocal8Bit());
            saveFile.close();
        }
        changedFlag = false;
    }
}

(6)从Json文件中批量添加Item至CoboBox下拉选项,并给每个下拉选项增加Tip提示?

///获取Json文件中的属性键值,往comboBox添加Items并显示itemTips,showName为初始化显示在comboBox上的名称
void DisJsonParam::addPropertiesAndTipsFromJson(QString prptesJsonFilePath,QString showName,QComboBox *comboBox)
{
    QFile file(prptesJsonFilePath);
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    QString value = file.readAll();
    file.close();
    QJsonParseError parseJsonErr;
    QJsonDocument propertiesJsonDoc = QJsonDocument::fromJson(value.toUtf8(), &parseJsonErr);
    if (! (parseJsonErr.error == QJsonParseError::NoError))
    {
        QMessageBox::information(this,"提示","无法读取Json文件");
        return;
    }
    QJsonObject propertiesJsonObj = propertiesJsonDoc.object();
    QStringList keyNameList = propertiesJsonObj.keys();
    keyNameList.removeOne(showName);

    QStandardItemModel *model = new QStandardItemModel(this);
    QStandardItem *item;
    item = new QStandardItem(showName);
    item->setToolTip(propertiesJsonObj[showName].toString());
    model->appendRow(item);
    for (int i = 0;i < keyNameList.size();i++)
    {
        item = new QStandardItem(keyNameList[i]);
        item->setToolTip(propertiesJsonObj[keyNameList[i]].toString());
        model->appendRow(item);
    }
    comboBox->setModel(model);
}

(7)TableWidget动态添加QComboBox?

QComboBox *propertiesCombobox = new QComboBox();
  addPropertiesAndTipsFromJson(_prptesJsonFilePath,key["propertyName"].toString(),propertiesCombobox);//调用(5)
  connect(propertiesCombobox, SIGNAL(currentIndexChanged(QString)), this, SLOT(saveChange2JsonObj()));//每个控件均连接信号以便数据交互
 ui->tableWidget->setCellWidget(i,j,propertiesCombobox);//i为所在行数,j为所在列数

(8)TableWidget动态添加QSpinBox(QDoubleSpinBox)?

        QDoubleSpinBox *upperSpinBoxItem = new QDoubleSpinBox();
        upperSpinBoxItem->setRange(-9999999999,9999999999);//设置数值显示范围
        upperSpinBoxItem->setValue(key["upper"].toDouble());
        connect(upperSpinBoxItem, SIGNAL(valueChanged(double)), this, SLOT(saveChange2JsonObj()));//每个控件均连接信号以便数据交互

ui->tableWidget->setCellWidget(i,j+2,upperSpinBoxItem);//i为所在行,j+2为所在列

 

(2)QTableWidget右键插入行,删除行?

上一篇:EasyUI ComboBox(下拉列表框)通过url加载调用远程数据并实时刷新


下一篇:清空窗体内控件内容的代码(已封装)