1. 程式人生 > >QT QListWidget 製作item編輯器

QT QListWidget 製作item編輯器

一、QListWidget簡介

二、ui介面設計

三、開啟檔案、儲存檔案

四、新增、插入、刪除、刪除全部等操作

 

一、QListWidget簡介

QListWidget類提供基於專案列表的小部件。

QListWidget提供類似於QListView提供的列表檢視,但具有用於新增和刪除項的經典的介面。 QListWidget使用內部模型來管理列表中的每個QListWidgetItem。

現在製作一個QListWidget的編輯器,編輯器的功能是:

1.新建列表並儲存到.txt檔案中。

2.開啟已有的列表檔案.txt,並讀入。

3.對新建或已有的列表進行編輯(新增、刪除、修改操作)

最終的主介面如下所示:


二、ui介面設計

首先新建MainWindow專案“QTextList”。

介面設計如上圖所示:在設計視窗拖入:一個ListWidget,以及若干個pushButton按鈕。

各控制元件物件修改ObjectName:

“開始編輯” -》 startEdit;“新增”-》add_btn;“插入”-》insertBtn;“刪除”-》dele_btn;

“刪除全部”-》deleAll;“停止編輯”-》stopEdit;

“開啟檔案”-》openFile;“儲存為”-》SaveBtn;

之後分別選中各按鈕右鍵“轉到槽”選擇“clicked()”,撞到槽函式。


三、開啟檔案、儲存檔案

       1.  開啟檔案並讀取內容至listWidget中

在“開啟檔案”按鈕的槽函式中新增以下內容:

void MainWindow::on_openFile_clicked()
{
    QFileDialog openFile;
    QString fileName = openFile.getOpenFileName(this,"OpenFile"," ","Text File(*.txt)");
    if(fileName =="")
    {
        return;
    }
    QFile file(fileName);
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        return;
    }
    else
    {
        QTextStream textStream(&file);
        //建立字串列表list及字串line,後者作為textStream.readline()函式的中間變數
        QStringList list;
        QString line;
        while(!textStream.atEnd())
        {
            line = textStream.readLine().remove('\n').remove(" ");
            //將專案新增到列表中
            list << line;
        }
        //將列表新增到listWidget中
        ui->listWidget->addItems(list);
        file.close();
    }
}

   2.儲存檔案,將編輯好的列表儲存至選擇路徑裡,替換或新建檔案。

在“儲存為”按鈕的槽函式中新增以下內容:

void MainWindow::on_SaveBtn_clicked()
{
    if(isEdit)
    {
        QMessageBox::warning(this,"Warning","The List is in Edit");
    }
    else
    {
        QFileDialog fileDialog;
        QString fileName = fileDialog.getSaveFileName(this,"SaveFile","","TExt File(*.txt)");
        if(fileName == "")
        {
            return;
        }
        QFile file(fileName);
        if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
        {
            return;
        }
        else
        {
            QTextStream textStream(&file);
            //按行將列表專案寫入檔案中
            for(int i=0;i<ui->listWidget->count();i++)
            {
                textStream << ui->listWidget->item(i)->text()+'\n';
            }
            QMessageBox::information(this,"Saved","the File Has been Saved~");
            file.close();
        }
    }
}

四、新增、插入、刪除、刪除全部等操作

列表編輯部分有新增、插入、刪除、修改等功能。這裡添加了“開始編輯”和“停止編輯”的按鈕,在所有編輯操作前需要使編輯處於活動狀態(這裡可能有點多此一舉,不管,先忽略)。

設定列表每項都處於雙擊可編輯狀態,也可以單獨寫一個函式,這裡新增到了各個函式裡。

 1.”新增”:指在列表尾部新增專案,其槽函式內容如下:

void MainWindow::on_add_btn_clicked()
{
    //isEdit 是全域性靜態變數int型,表示當前是否處於編輯狀態。
    if(isEdit)
    {
        //建立QListWidgetItem物件,並初始化為“NULL”
        QListWidgetItem *item = new QListWidgetItem;
        item->setText("NULL");
        ui->listWidget->addItem(item);

        //設定當前所有項為雙擊可編輯狀態
        for(int i=0;i<ui->listWidget->count();i++)
        {
            item = ui->listWidget->item(i);
            item->setFlags(item->flags() | Qt::ItemIsEditable);
            item->listWidget()->setEditTriggers(QAbstractItemView::DoubleClicked);
        }
    }
    else
    {
        QMessageBox::warning(this,"Warning","Current Items is UnEditable!");
    }
}

   2. 插入:表示在當前項的後面插入新項。其槽函式內容如下:

void MainWindow::on_insertBtn_clicked()
{
    if(isEdit)
    {
        //使用insertItem()函式,在當前專案後插入新項
        ui->listWidget->insertItem(ui->listWidget->currentRow()+1,"NULL");
        //設定當前所有項雙擊可編輯
        for(int i=0;i<ui->listWidget->count();i++)
        {
            QListWidgetItem* item = new QListWidgetItem;
            item = ui->listWidget->item(i);
            item->setFlags(item->flags() | Qt::ItemIsEditable);
            item->listWidget()->setEditTriggers(QAbstractItemView::DoubleClicked);
        }
    }
    else
    {
        QMessageBox::warning(this,"Warning","CUrrent Items is UnEditable!");
    }
}

 3. 刪除:刪除當前選中的項,程式碼如下:

void MainWindow::on_dele_btn_clicked()
{
    if(isEdit)
    {
        //使用takeItem()函式,刪除當前項
        QListWidgetItem* item = ui->listWidget->takeItem(ui->listWidget->currentRow());
        delete item;
    }
    else
    {
        QMessageBox::warning(this,"Warning","CUrrent Items is UnEditable!");
    }
}

 4. 刪除全部:刪除當前所有項,程式碼如下:

void MainWindow::on_deleAll_clicked()
{
    if(isEdit)
    {
        if(ui->listWidget->count() ==0)
        {
            return;
        }
        else
        {
            //count為當前列表的項數,使用一個迴圈,從第一項往下逐個刪除
            int  count = ui->listWidget->count();
            for(int i=0;i<count;i++)
            {
               QListWidgetItem* it =  ui->listWidget->takeItem(0);
               delete it;
            }

        }
    }
    else
    {
        QMessageBox::warning(this,"Warning","CUrrent Items is UnEditable!");
    }
}

  5. (可有可無的)開始編輯及停止編輯按鈕槽函式內容如下:

void MainWindow::on_startEdit_clicked()
{

    isEdit=1;
    QMessageBox::information(this,"Editable","現在可以開始編輯了。");
    for(int i=0;i<ui->listWidget->count();i++)
    {
        QListWidgetItem* item = new QListWidgetItem;
        item = ui->listWidget->item(i);
        //設定每個item都處於可編輯狀態
        item->setFlags(item->flags() | Qt::ItemIsEditable);
    }
}

void MainWindow::on_stopEdit_clicked()
{
    isEdit = 0;
    for(int i=0;i<ui->listWidget->count();i++)
    {
        QListWidgetItem* item = new QListWidgetItem;
        item = ui->listWidget->item(i);
        //設定每個item都處於不可編輯狀態
        item->setFlags(item->flags() | Qt::ItemIsDropEnabled);
    }
    QMessageBox::information(this,"Saved","現在停止編輯");
}