Qt

Qt ListItem项目实现

3

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界面如图所示:

ListItem

其中包括:

一个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*)

完成项目。

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部