mainwindow.h中代码文件:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QListWidget> #include <QListWidgetItem> #include <QStringList> #include <QMessageBox> #include <QDebug> #include <QDir> #include <QFileDialog> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; private slots: void addCitySlot();//实现添加操作 void deleteCitySlot();//实现删除操作 void deleteAllSlot();//实现删除所有操作 void showDirSlot();//实现显示目录操作 void singleClickedSlot(QListWidgetItem *);//实现单击项响应操作 void doubleClickedSlot(QListWidgetItem *);//实现双击项响应操作 }; #endif // MAINWINDOW_H
mainwindow.cpp中代码文件:
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QObject::connect(ui->addButton,SIGNAL(clicked(bool)),this,SLOT(addCitySlot())); QObject::connect(ui->lineEdit,SIGNAL(returnPressed()),this,SLOT(addCitySlot())); QObject::connect(ui->deleteButton,SIGNAL(clicked(bool)),this,SLOT(deleteCitySlot())); QObject::connect(ui->deleteAllButton,SIGNAL(clicked(bool)),this,SLOT(deleteAllSlot())); QObject::connect(ui->showDirButton,SIGNAL(clicked(bool)),this,SLOT(showDirSlot())); QObject::connect(ui->listWidget,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,SLOT(doubleClickedSlot(QListWidgetItem*))); } MainWindow::~MainWindow() { delete ui; } void MainWindow::addCitySlot() { QString cityName=ui->lineEdit->text(); QListWidgetItem *item=new QListWidgetItem; item->setText(cityName); ui->listWidget->addItem(item); ui->lineEdit->clear(); } void MainWindow::deleteCitySlot() { QListWidgetItem *item=ui->listWidget->takeItem(ui->listWidget->currentRow()); //QListWidgetItem *item=ui->listWidget->takeItem(2); delete item; } void MainWindow::deleteAllSlot() { int count=ui->listWidget->count(); for(int index=count;index>=0;index--) { QListWidgetItem *item=ui->listWidget->takeItem(index); delete item; } } void MainWindow::showDirSlot() { ui->listWidget->clear(); QDir dir=QDir::current(); QStringList fileNames=dir.entryList(); if(fileNames.size()==0) { QMessageBox::information(this,"提示","当前文件夹为0"); return; } for(int index=0;index<fileNames.size();index++) { if(fileNames.at(index)=="." || fileNames.at(index)=="..") continue; QListWidgetItem *item=new QListWidgetItem; item->setText(fileNames.at(index)); ui->listWidget->addItem(item); } } void MainWindow::singleClickedSlot(QListWidgetItem *item) { QMessageBox::information(this,"information","single clicked "+item->text()); } void MainWindow::doubleClickedSlot(QListWidgetItem *item) { QMessageBox::information(this,"information","double clicked "+item->text()); }
主要实现的操作为:
- 在LineEdit中写入需要新添加的项,进行添加。
- 选中ListWidget中的项,按删除pushButton进行删除。
- 按删除全部PushButton进行全部删除
- 按显示目录PushButton进行显示目录
首先设计Ui界面如图所示:
其中包括:
一个ListWidget组件,一个LineEdit,四个pushButton
一.首先实现添加操作:
在mainwindow.h中添加私有槽:
void addCitySlot();
在mainwindow.cpp中对其进行实现:
获取LineEdit中的字符串,放在定义的字符串中,进行添加。
获取字符串:
QString cityName=ui->lineEdit->text();
定义一个QListWidgetItem类的对象,用于设置ListWidget中的值:
QListWidgetItem *item=new QListWidgetItem; item->setText(cityName);
关于QListWidgetItem,Qt帮助文档中的解释如下:
The QListWidgetItem class provides an item for use with the QListWidget item view class.
翻译为:QListWidgetItem类提供一个项,用来使用QListWidget项视图类。
这里用到了QListWidgetItem的setText()方法。
Qt帮助文档中的解释如下:
Sets the text for the list widget item’s to the given text.
翻译为:为list widget的项目设置text为给定的text.
所以,这里已经cityName这个项放入了item中。
之后需要将item添加到listwidget中。
这里用到:
void QListWidget::addItem(QListWidgetItem * item)
Ui界面的ListWidget的addItem()方法。
关于这个方法,Qt帮助文档中的解释如下:
Inserts the item at the end of the list widget.
翻译为:插入一个项在list widget的末尾。
这里看到addItem的参数为:QListWidgetItem * item
正是我们之前定义的类的对象。
实现为:
ui->listWidget->addItem(item);
之后将lineEdit中的内容清空:
ui->lineEdit->clear();
在完成这个过程中,需要进行头文件的添加。
在实现操作之后,添加信号与槽的连接,信号为addButton的点击信号,槽为addCitySlot()槽。
连接代码:
QObject::connect(ui->addButton,SIGNAL(clicked(bool)),this,SLOT(addCitySlot()));
完成添加项的操作。
二.实现选中项的删除操作:
添加私有槽:
void deleteCitySlot();
操作如下:
QListWidgetItem *item=ui->listWidget->takeItem(ui->listWidget->currentRow());
定义一个QListWidgetItem类的指针,用于存放从Ui界面得到的Item.
这个过程中用到了两个函数:
listWidget的takeItem()方法。
在Qt帮助文档的解释如下:
Removes and returns the item from the given row in the list widget; otherwise returns 0.
Items removed from a list widget will not be managed by Qt, and will need to be deleted manually.
翻译为:删除并返回列表小部件从给定的行项目;否则返回0
从list widget中删除项不是有Qt管理的,这需要不动删除。
所以当用到takeItem()方法的时候,就已经删除了这个项。
listWidget的currentRow()方法:
int currentRow() const
Qt帮助文档的解释如下:
This property holds the row of the current item.
翻译为:这个currentRow属性,保持当前的项。
用currentRow()方法返回当前选中项的索引(int),给takeItem()方法。
让其将这个项删除。并且返回给item中。
最后删除item指针。
delete item;
举例:
QListWidgetItem *item=ui->listWidget->takeItem(2);
如果直接在takeItem()方法中填入2,会删除list widget的第三项(从0开始)
完成删除当前选中项的操作。
三.实现删除所有项操作:
int count=ui->listWidget->count(); for(int index=count;index>=0;index--) { QListWidgetItem *item=ui->listWidget->takeItem(index); delete item; }
首先得到listwidget的项的数目。
用到了count()方法。
再用从最后一项,到第一项的方法,删除所有的item.
注意:这里不能从第一项到最后一项的删除,因为当你删除第一项的时候,第二项就变成了第一项,所以这样就不能删除count这个索引代表的这一项。
完成实现删除所有项操作。
四.实现显示目录操作:
添加私有槽:
void showDirSlot();
在mainwindow中添加需要实现的功能。
当显示文件目录的时候,需要将listwidegt中的项全部删除,再显示。
所以用到:
ui->listWidget->clear();//情况所有项
需要得到当前文件的目录:
QDir dir=QDir::current();
QDir的current()方法的Qt帮助文档的解释如下:
Returns the application’s current directory.
翻译为:返回这个应用的当前目录。
放在了dir中。再用entryList()方法:
Qt帮助文档中的解释如下:
Returns a list of the names of all the files and directories in the directory.
翻译为:返回这个目录中的目录和文件的名字的列表
其返回值是QStringlist类型。
if(fileNames.size()==0) { QMessageBox::information(this,"提示","当前文件夹为0"); return; } for(int index=0;index<fileNames.size();index++) { if(fileNames.at(index)=="." || fileNames.at(index)=="..") continue; QListWidgetItem *item=new QListWidgetItem; item->setText(fileNames.at(index)); ui->listWidget->addItem(item); }
这里进行判断,观察其是否有返回文件或者文件名。
在返回的目录中,会有两个已存在的目录,且不可删除。分别是”.”和”..”
我们不需要显示这两个目录。
这里用到了at()方法,at方法在Qt帮助文档的解释如下:
Returns the item at index position i in the list. i must be a valid index position in the list
翻译为:返回在一个列表的索引所在位置的项。其中i(索引)必须在这个列表中是可见的。
最后,就如添加项目的方法将这个项添加到listwidegt.
五.实现listwidget中的项的单击操作和双击操作:
在定义完成私有槽之后,实现私有槽的操作后,直接连接发出的信号,其信号为:
QObject::connect(ui->listWidget,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,SLOT(doubleClickedSlot(QListWidgetItem*)));
和itemSingleClicked(QListWidgetItem*)
完成项目。