程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Qt 雜記——QTableWidget列表添加、刪除(備份),qtqtablewidget

Qt 雜記——QTableWidget列表添加、刪除(備份),qtqtablewidget

編輯:C++入門知識

Qt 雜記——QTableWidget列表添加、刪除(備份),qtqtablewidget


  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,到此完畢。

  

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved