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","現在停止編輯");
}