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