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","现在停止编辑");
}

猜你喜欢

转载自blog.csdn.net/qq_29406323/article/details/81507067