首页 > 代码库 > Qt 杂记——QTableWidget列表添加、删除(备份)

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_OBJECTpublic:    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=http://www.mamicode.com/="") 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,到此完毕。

  

 

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