您的位置:首页 > 编程语言 > Qt开发

Qt学习——QListWidget控件的使用

2015-12-21 10:50 447 查看
Qt提供QListWidget类列表框控件用来加载并显示多个列表项。QListWidgetItem类就是列表项类。一般列表框控件中的列表项有两种加载方式:

一种是由用户手动添加的列表项,比如音乐播放器中加载音乐文件的文件列表,每一个音乐文件都是一个列表项。

对于这种列表项,用户可以进行增加、删除、单击以及双击等操作。

 

一种是由程序员事先编写好,写在程序中供用户选择的列表项,比如餐厅的电子菜单,每一道菜对应一个列表项。

对于这种列表项,用户可以进行单机和双击操作(增加和删除操作也是可以进行的,但是一般的点菜系统会屏蔽掉这种功能)。

QListWidget类列表框控件支持两种列表项显示方式,即QListView::IconMode和QListView::ListMode。

总结一下列表框常用的增加、删除、单击、双击操作以及列表项显示方式设置,先给出全部代码,再解释。



图1   程序界面
首先是main.cpp源文件

#include <QtGui/QApplication>

#include "mainwindow.h"

#include <QTextCodec>

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

//Qt文本的国际化显示

QTextCodec::setCodecForTr(QTextCodec::codecForName("GB18030"));

QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB18030"));

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB18030"));


MainWindow w;

w.show();

return a.exec();

}



其次是mainwindow.h头文件

#ifndef MAINWINDOW_H

#define MAINWINDOW_H


#include <QMainWindow>


#include <QtDebug>

#include <QMessageBox>


#include <QListWidgetItem>  //列表框空间头文件

#include <QFileDialog>  //文件对话框控件

#include <QStringList>  //字符串容器

#include <QDir> //目录类头文件

#include <QString>


namespace Ui {

class MainWindow;

}


class MainWindow : public QMainWindow

{

Q_OBJECT


public:

explicit MainWindow(QWidget *parent = 0);

~MainWindow();


private:

Ui::MainWindow *ui;

private slots:

void addbtn();

void deletebtn();

void delallbtn();

void addallbtn();

void singleclicked(QListWidgetItem* item);

void doubleclicked(QListWidgetItem* item);


};


#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);

this->setWindowTitle(tr("listWidget学习"));   //设置标题框文本

ui->listWidget->setViewMode(QListView::IconMode);   //设置显示模式为图标模式

//ui->listWidget->setViewMode(QListView::ListMode);   //设置显示模式为列表模式

QObject::connect(ui->AddButton,SIGNAL(clicked()),this,SLOT(addbtn()));

QObject::connect(ui->lineEdit,SIGNAL(returnPressed()),this,SLOT(addbtn()));

QObject::connect(ui->DeleteButton,SIGNAL(clicked()),this,SLOT(deletebtn()));

QObject::connect(ui->DelAllButton,SIGNAL(clicked()),this,SLOT(delallbtn()));

QObject::connect(ui->ShowDirButton,SIGNAL(clicked()),this,SLOT(addallbtn()));

//QObject::connect(ui->listWidget,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(singleclicked(QListWidgetItem*)));

QObject::connect(ui->listWidget,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,SLOT(doubleclicked(QListWidgetItem*)));

}


MainWindow::~MainWindow()

{

delete ui;

}


/***** 添加单个列表项 *****/

void MainWindow::addbtn()

{

QString str = ui->lineEdit->text(); //获取行编辑框文本

QListWidgetItem *item = new QListWidgetItem;

item->setText(str); //设置列表项的文本

ui->listWidget->addItem(item);  //加载列表项到列表框

//delete item;  //此处若解除注释,将无法添加到列表框

//item = NULL;

ui->lineEdit->clear();  //清空行编辑框

}


/***** 删除单个列表项 *****/

void MainWindow::deletebtn()

{

//获取列表项的指针

QListWidgetItem *item = ui->listWidget->takeItem(ui->listWidget->currentRow());

delete item;//释放指针所指向的列表项

}


/***** 删除多个列表项 *****/

void MainWindow::delallbtn()

{

int num = ui->listWidget->count();  //获取列表项的总数目

ui->listWidget->setFocus(); //将光标设置到列表框上,若注释该语句,则删除时,要手动将焦点设置到列表框,即点击列表项

for(int i=0;i<num;i++)

{   //逐个获取列表项的指针,并删除

QListWidgetItem *item = ui->listWidget->takeItem(ui->listWidget->currentRow());

delete item;

}

}


/***** 添加多个列表项 *****/

void MainWindow::addallbtn()

{

QStringList FileNames = QFileDialog::getOpenFileNames(this,"打开",QDir::currentPath(),"所有文件(*.*);;文本文档(*.txt)");


//方法1  整体添加

//ui->listWidget->addItems(FileNames);


//方法2  逐个添加

int index=0,count=0;

//QListWidgetItem *item = new QListWidgetItem;  //…………注释1

count = FileNames.count();  //获取打开文件的总数目


//for(index = 0;index<count;index++)//这样会报错,无法先取出栈底元素  //注释2

for(index=count-1;index>=0;index--) //QList<QString>的数据结构是栈,只能从栈顶取元素

{

QListWidgetItem *item = new QListWidgetItem;

item->setText(FileNames.takeAt(index)); //逐个设置列表项的文本

//qDebug()<<FileNames.takeAt(index);//…………注释3

ui->listWidget->addItem(item);  //加载列表项到列表框

}

}

/*

注意事项:

1、QList<QString>的数据结构是栈,只能从栈顶取元素,所以如果将for循环注释掉,

将注释2解开,程序会出错。因为无法首先取出栈底元素,只能从栈顶开始。

2、对于for循环中的takeAt()函数来说,是将index 所指定的索引位置的数据取走,

并不是复制。所以,如果将注释3的打印语句解开的话,数据元素被取走,无法成功打印,程序出错。

3、如果将for循环中的QListWidgetItem *item = new QListWidgetItem;语句注释起来,

并将注释1和注释3解开,就可以打印出字符串列表FileNames中所有的字符串。只是运行程序会发成覆盖,

最终显示在列表框中的列表项是栈底元素(编译时,需要将takeAt()函数注释掉)。

*/



/***** 列表项单击操作 *****/

void MainWindow::singleclicked(QListWidgetItem* item)

{

QMessageBox::information(this,"单击消息","单击"+item->text());

}


/***** 列表项双击操作 *****/

void MainWindow::doubleclicked(QListWidgetItem* item)

{

QMessageBox::information(this,"双击消息","双击"+item->text());

}



一、列表项的显示设置

ui->listWidget->setViewMode(QListView::IconMode);  
//设置显示模式为图标模式


ui->listWidget->setViewMode(QListView::ListMode);  
//设置显示模式为列表模式


 

二、列表框常用操作

列表框控件常用的操作:添加操作、删除操作、单击操作以及双击操作,下面分别介绍。

1、添加操作

添加操作又可以分为单列表项操作和多列表项操作。

①单列表项操作(以添加用户输入到行编辑框中的数据为例)

voidMainWindow::addbtn()
{
   
QStringstr=ui->lineEdit->text();    
//获取行编辑框文本

   
QListWidgetItem*item=newQListWidgetItem;

   
item->setText(str);                   
 //设置列表项的文本

   
ui->listWidget->addItem(item);    //加载列表项到列表框

//   
deleteitem;                         
//此处若解除注释,将无法添加到列表框

//   
item=NULL;

   
ui->lineEdit->clear();                 
//清空行编辑框

}

②多列表项操作(以添加多个文件名到列表框为例)

QStringList QFileDialog::getOpenFileNames ( QWidget * parent =
0, constQString & caption = QString(), const QString & dir =
QString(), const QString& filter = QString(), QString * selectedFilter =
0, Options options =0 )[static]

该静态成员函数将按照给定的参数构造一个模态文件对话框,将用户选择的一个或多个现存的文件的路径名存储到字符串列表中,并返回该字符串列表。

QString QDir::currentPath () [static]

该静态成员函数用来返回应用程序的当前工作目录的绝对路径。

void QListWidget::addItems (const QStringList & labels )

该函数用来将字符串列表中的全部字符串作为列表项,添加到列表框中。


void QListWidget::addItem ( QListWidgetItem * item )

该函数用来将一个列表项添加到列表框当中。

注意:一个列表项只能被添加到列表框中一次,如果多次添加同一个列表项到列表框中,将导致不可预期的结果。

void QListWidget::addItem (const QString & label )

重载函数,用来将参数label所引用的字符串作为一个列表项,添加到列表框中。

int QList::count ()const    
     int QList::size ()const

上述两个函数的功能等价,都是用来返回列表中存储的对象元素的个数。

T QList::takeAt ( int i )

该函数按照参数i指定的索引位置,将存储在列表中对应的对象元素移除并返回。返回类型为模板类型,由存储的数据的类型决定。索引值的大小范围为0<=
 i  <= size()。

 

//方法1 
整体添加

voidMainWindow::addallbtn()
{
   
QStringListFileNames=QFileDialog::getOpenFileNames(this,"打开",

      QDir::currentPath(),
      "所有文件(*.*);;文本文档(*.txt)");
    ui->listWidget->addItems(FileNames);
}

 
//方法2 
逐个添加

voidMainWindow::addallbtn()
{  

    QStringListFileNames=QFileDialog::getOpenFileNames(this,"打开",
      QDir::currentPath(),
      "所有文件(*.*);;文本文档(*.txt)");

   
intindex=0,count=0;

//   
QListWidgetItem*item=newQListWidgetItem;       //…………注释1

   
count=FileNames.count();           
//获取打开文件的总数目

//   
for(index=0;index<count;index++)   
//这样会报错,无法先取出栈底元素  //注释2

   
//QList<QString>的数据结构是栈,只能从栈顶取元素

  for(index=count-1;index>=0;index--)    

  
{

       
QListWidgetItem*item=newQListWidgetItem;

       
item->setText(FileNames.takeAt(index));        //逐个设置列表项的文本

//       
qDebug()<<FileNames.takeAt(index);            //…………注释3

       
ui->listWidget->addItem(item);                           //加载列表项到列表框

  
}

}

注意事项:
1、QList<QString>的数据结构是栈,只能从栈顶取元素,所以如果将for循环注释掉,将注释2解开,程序会出错。因为无法首先取出栈底元素,只能从栈顶开始。
2、对于for循环中的takeAt()函数来说,是将index 所指定的索引位置的数据取走,并不是复制。所以,如果将注释3的打印语句解开的话,数据元素被取走,无法成功打印,程序出错。
3、如果将for循环中的QListWidgetItem *item = new QListWidgetItem;语句注释起来,并将注释1和注释3解开,就可以打印出字符串列表FileNames中所有的字符串。只是运行程序会发成覆盖,最终显示在列表框中的列表项是栈底元素(编译时,需要将takeAt()函数注释掉)。

 
 
2、删除操作

删除操作又可以分为单文件操作和多文件操作。

①删除单个列表项(删除列表框中的单个列表项)

QListWidgetItem *QListWidget::takeItem ( int row )
该函数用来将索引号为row的列表项从列表框移除,并返回该列表项的指针。

int
currentRow
() const

该常成员函数用来获取当前列表项的索引号,并返回。

 

voidMainWindow::deletebtn()
{
   
//获取列表项的指针

   
QListWidgetItem*item=ui->listWidget->takeItem(ui->listWidget->currentRow());

   
deleteitem;       
//释放指针所指向的列表项

}

②删除多个文件(删除列表框中的所有列表项)

voidMainWindow::delallbtn()
{
   
intnum=ui->listWidget->count(); 
//获取列表项的总数目

   
ui->listWidget->setFocus();     
//将光标设置到列表框上

   
for(inti=0;i<num;i++)

   
{  //逐个获取列表项的指针,并删除

       
QListWidgetItem*item=ui->listWidget->takeItem(ui->listWidget->currentRow());

       
deleteitem;

   
}

}
 
3、点击操作
①单击操作(输出单击项的文本)
voidMainWindow::singleclicked(QListWidgetItem*item)
{
   
QMessageBox::information(this,"单击消息","单击"+item->text());

}
 
②双击操作(输出双击项的文本)
voidMainWindow::doubleclicked(QListWidgetItem*item)
{
   
QMessageBox::information(this,"双击消息","双击"+item->text());

}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息