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

摘要:
inputDialog-˃show();inputDialog-˃exec();如果{DataUtil*DataUtil=newDataUtil();DataUtil-˃AddEditedRow;}如果单击ok,则调用添加该行的函数。boolDataUtil::AddEditedRow{ifreturnfalse;for{ifeturntrue;}表-˃insertRow;QTableWidgetItem*newItem=newQTableWicketItem();newItem-˃setText;table-˃setItem;QTableWidgetItem*newItem1=newQTableWicketItem();newItem1-˃setText;table-˃setItem;returntrue;}添加的行后面总是跟着最后一行。但我发现这是不可能的,因为在添加时,每个单元格都是一个项,如果选择一行,selectItems()返回两行,而我只需要一行数据。确切地说,我只需要一行第一列中的数据。您可以通过比较第一列中的数据是否相同来决定是否删除。如果{//两列QList˂QList*˃*libsList=newQList˂QRist*˃();QList˂QList*˃*SelectedLibs=newQLlistQString˃*˃());对于{QList*libL=newQLList(),libL--˃追加;libL--˃附加;libsList--˃;}对于{//添加2 QList<QString>*SelectedL=newQList>QString();SelectedL-˃append(table-˃selectedItems()).at(index

1.列表的添加

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

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

界面:

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

代码:

inputDialog.h  

#ifndef INPUTDIALOG_H
#define INPUTDIALOG_H
#include <QDialog>

namespaceUi {
classInputDialog;
}

class InputDialog : publicQDialog
{
    Q_OBJECT

public:
    explicit InputDialog(QWidget *parent = 0);
    ~InputDialog();
signals:
    void sendDataList(QList<QString> *inputDataList);
privateslots:
    voidon_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(newUi::InputDialog)
{
    ui->setupUi(this);
}

InputDialog::~InputDialog()
{
    deleteui;
}

voidInputDialog::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=newInputDialog();
   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=newDataUtil();
         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=newQTableWidgetItem();
    newItem->setText(key);
    table->setItem(table->rowCount()-1,0,newItem);

    QTableWidgetItem *newItem1=newQTableWidgetItem();
    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列表添加、删除(备份)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇sql自动化检查和分析工具 :soar和soar-web 安装和使用体验哈希爆破神器Hashcat的用法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

element table显示滚动条

1 /* .tableX为要显示滚动条的类名 */ 2 /* 显示横向滚动条 */ 3 .tableX .el-table--scrollable-x .el-table__body-wrapper { 4 padding: 0 0 5px 0; 5 margin: 0 0 5px 0; 6 overflow-x: auto; 7...

MySQL-死锁查询

1、查询是否锁表 show OPEN TABLES where In_use > 0; 查询到相对应的进程 === 然后 killid 2、查询进程 show processlist 补充: 查看正在锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 查看等待锁的事务 SELECT * FROM I...

vue+elementui +input输入框关键字筛选检索表格数据展示+分页功能

第一种用axios发送请求到后台,需要后台配合,才能在表格里面渲染页面;想偷懒的小伙建议去直接粘贴复制第三种 <template> <div class="tableDatas"> <div class="searchWord"> <div style="display: inline-block"> 搜索...

Flink--将表转换为DataStream或DataSet

A Table可以转换成a DataStream或DataSet。通过这种方式,可以在Table API或SQL查询的结果上运行自定义的DataStream或DataSet程序 将表转换为DataStream 有两种模式可以将 Table转换为DataStream: 1:Append Mode 将一个表附加到流上 2:Retract Mode 将表转换为流...

浅谈 SQL 注入(注入篇)

一、SQL注入简介 1.1 什么是SQL注入 在用户可控制的参数上过滤不严或没有任何限制,使得用户将传入的参数(如URL,表单,http header)与SQL语句合并构成一条 SQL语句传递给web服务器,最终传递给数据库执行增删改查等操作,并基于此获取数据库数据或提权进行破坏。 1.2 SQL注入产生的原因 SQL Injection: 程序员在编写代...

[转]oracle在删除表表空间用户时,如何释放磁盘空间

一、drop表 执行drop table xx 语句 drop后的表被放在回收站(user_recyclebin)里,而不是直接删除掉。这样,回收站里的表信息就可以被恢复,或彻底清除。 通过查询回收站user_recyclebin获取被删除的表信息,然后使用语句 flashback table...