• Qt 杂记——QTableWidget列表添加、删除(备份)


      1.列表的添加

        需求:向一个有两列的Table中添加一条数据

        思路:新建一个inputDialog,通过按钮打开Qt自带的inputDialog,传递回输入的数据,再添加到列表中

        界面:

            

        代码:

        inputDialog.h  

    #ifndef INPUTDIALOG_H
    #define INPUTDIALOG_H
    
    #include <QDialog>
    
    namespace Ui {
    class InputDialog;
    }
    
    class InputDialog : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit InputDialog(QWidget *parent = 0);
        ~InputDialog();
    signals:
        void sendDataList(QList<QString> *inputDataList);
    private slots:
        void on_buttonBox_accepted();
    
    
    private:
        Ui::InputDialog *ui;
    };
    
    #endif // INPUTDIALOG_H

      inputDialog.cpp

    #include "inputdialog.h"
    #include "ui_inputdialog.h"
    InputDialog::InputDialog(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::InputDialog)
    {
        ui->setupUi(this);
    }
    
    InputDialog::~InputDialog()
    {
        delete ui;
    }
    
    void InputDialog::on_buttonBox_accepted()
    {
        QList<QString> *inputDataList=new  QList<QString>();
        inputDataList->append(ui->KeyEdit->text());
        inputDataList->append(ui->ValueEdit->text());
        emit sendDataList(inputDataList);
    }

      通过点击inputDialog上的确定按钮,将key和value的值组装成一个List,通过信号函数sendDataList()发射,等待被接收。

      接下来是主界面上接收,通过点击界面上的add按钮,弹出对话框:

     //初始化inputDialog
       inputDialog=new InputDialog();
       inputDialog->setModal(true); //总在最前
       connect(inputDialog,SIGNAL(sendDataList(QList<QString>*)),this,SLOT(ReceiveData(QList<QString>*)));

      连接inputDialog发射的信号和主窗体的槽函数。

     inputDialog->show();
         inputDialog->exec();
         if(inputDialog->Accepted==QDialog::Accepted){
             DataUtil *dataUtil=new DataUtil();
             dataUtil->AddEditedRow(ui->HardConTable,inputDataList->at(0),inputDataList->at(1));
         }

      如果点击ok,调用添加行的函数。

    bool DataUtil::AddEditedRow(QTableWidget *table,QString key,QString value){
        if(table==NULL||key==""||value=="") return false;
    
        for(int i=0;i<table->rowCount();i++){
          if(key==table->item(i,0)->text()) return true;
        }
    
        table->insertRow(table->rowCount());
        QTableWidgetItem *newItem=new QTableWidgetItem();
        newItem->setText(key);
        table->setItem(table->rowCount()-1,0,newItem);
    
        QTableWidgetItem *newItem1=new QTableWidgetItem();
        newItem1->setText(value);
        table->setItem(table->rowCount()-1,1,newItem1);
        return true;
    }

    被添加行总是接在最后一行。

    =========================分割线========================================================================================

    2.列表的整行删除操作

      需求:通过点击界面上的remove按钮,(表有两列)则移除选中行,支持多行选择删除。

      思路历程:一开始想的是,通过QTableWidget的 selectedItems()方法返回一个List,再遍历整个列表中的内容,相同则删除。但是发现不行,因为在添加的时候每个单元格是一个item,那选择一行,selectItems()返回的是两个,而我只需要一行的数据,准确的说只需要一行的第一列的数据,通过对比第一列的数据是否相同就可以决定是否删除。(刚才反应过来了,如果遍历selectedlist的时候,每次跳一个读取就是选中行的第一列)昨天脑子不太好用)

    if(table->columnCount()==2){ //两列
            QList<QList<QString>*> *libsList=new QList<QList<QString>*>();
            QList<QList<QString>*> *SelectedLibs=new  QList<QList<QString>*>();
    
    
            for(int i=0;i<table->rowCount();i++){
                QList<QString> *libL=new QList<QString>();
    
                libL->append(table->item(i,0)->text());
                libL->append(table->item(i,1)->text());
                libsList->append(libL);
            }
            for(int index=0;index<table->selectedItems().count();index+=2){ //加2
                 QList<QString> *SelectedL=new QList<QString>();
                 SelectedL->append(table->selectedItems().at(index)->text()); //该行第一列
                 SelectedL->append(table->selectedItems().at(index+1)->text());//该行第二列
                 SelectedLibs->append(SelectedL);
            }
            this->removeListItems(SelectedLibs,libsList); //逐行删除libsList中与SelectedLibs相同的行(只比较第一列的值)
            showListTable(table,libsList); //将修改过的libsList重新显示在列表中
            return true;
        }else{
            return false;
        }

     下面是调用的两个函数:

    bool DataUtil::removeListItems(QList<QList<QString> *> *SelectedLibs,QList<QList<QString> *> *AllLibsList){
        if(SelectedLibs==NULL||AllLibsList==NULL) return false;
        for(int i=0;i<SelectedLibs->count();i++){
            for(int j=0;j<AllLibsList->count();j++){
                if(SelectedLibs->at(i)->at(0)==AllLibsList->at(j)->at(0)){
                    AllLibsList->removeAt(j);
                }
            }
        }
        return true;
    }
    bool DataUtil::showListTable(QTableWidget *table,QList<QList<QString>* >  *LibsList){
        //清空
        table->setRowCount(0);
    
       for( int i=0;i<LibsList->count();i++){
          this->AddEditedRow(table,LibsList->at(i)->at(0),LibsList->at(i)->at(1));
       }
       return true;
    }

    ok,到此完毕。

      

  • 相关阅读:
    队列课下作业
    20162305 2017-2018-1 《程序设计与数据结构》第6周学习总结
    20162305 2017-2018-1 《程序设计与数据结构》第5周学习总结
    线性结构 实验报告 20162305
    算法复杂度-实验博客
    2017-2018-1 《程序设计与数据结构》第3周学习总结
    20162305 2017-2018-1 《程序设计与数据结构》第2周学习总结
    20162316刘诚昊 课下排序测试
    20162316刘诚昊 17年10月9日测验“排序课堂测试”
    20162316刘诚昊 第五周学习总结
  • 原文地址:https://www.cnblogs.com/ForRickHuan/p/5964475.html
Copyright © 2020-2023  润新知