Qt学习——QListWidget控件的使用
转载:GDUTLYP
Qt提供QListWidget类列表框控件用来加载并显示多个列表项。QListWidgetItem类就是列表项类。
一般列表框控件中的列表项有两种加载方式:
- 一种是由用户手动添加的列表项,比如音乐播放器中加载音乐文件的文件列表,每一个音乐文件都是一个列表项。对于这种列表项,用户可以进行增加、删除、单击 以及双击等操作。
- 一种是由程序员事先编写好,写在程序中供用户选择的列表项,比如餐厅的电子菜单,每一道菜对应一个列表项。对于这种列表项,用户可以进行单机和双击操作(增加和删除操作也是可以进行的,但是一般的点菜系统会屏蔽掉这种功能)。
QListWidget类列表框控件支持两种列表项显示方式,即QListView::IconMode和QListView::ListMode。
总结一下列表框常用的增加、删除、单击、双击操作以及列表项显示方式设置,先给出全部代码,再解释。

程序效果(程序的ui界面根据此设计)
首先是main.cpp源文件
#include <QtGui>
#include <QApplication>
#include "mainwindow.h" 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 = );
~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=;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=,count=;
// QListWidgetItem *item = new QListWidgetItem; //…………注释1
count = FileNames.count(); //获取打开文件的总数目 // for(index = 0;index<count;index++) //这样会报错,无法先取出栈底元素 //注释2
for(index=count-;index>=;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 = , constQString & caption = QString(), const QString & dir = QString(), const QString& filter = QString(), QString * selectedFilter = , Options options = )[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=,count=;
// QListWidgetItem*item=newQListWidgetItem; //…………注释1
count=FileNames.count(); //获取打开文件的总数目
// for(index=0;index<count;index++) //这样会报错,无法先取出栈底元素 //注释2
//QList<QString>的数据结构是栈,只能从栈顶取元素
for(index=count-;index>=;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=;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());
}
Qt学习——QListWidget控件的使用的更多相关文章
- Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等
目录 一.概述 二.效果展示 三.定制表头 1.重写数据源 2.重写QHeaderView 四.设置属性 五.相关文章 原文链接:Qt实现表格控件-支持多级列表头.多级行表头.单元格合并.字体设置等 ...
- Delphi 7学习开发控件
我们知道使用Delphi快速开发,很大的一方面就是其强大的VCL控件,另外丰富的第三方控件也使得Delphi程序员更加快速的开发出所需要的程序.在此不特别介绍一些概念,只记录自己学习开发控件的步骤.假 ...
- 过实现鹰眼图这个功能来进一步学习MapControl控件
我们通过实现鹰眼图这个功能来进一步学习MapControl控件.在实现鹰眼图之前,我们需 要接口有更深入的了解. 变主动为被动-出接口(OutBound interface) COM编程类似客户端和服 ...
- CAD控件:QT开发使用控件入门
1. 环境搭建: 3 1.1. 安装Qt 3 1.2. 安装Microsoft Windows SDK的调试包 6 2. QT中使用MxDraw控件 7 1.3. 引入控件 7 3. 打开DWG文件 ...
- 一款有意思的 Qt 飞行仪表控件
最近在网上偶然发现一款Qt飞行仪表板控件,真的很酷哦! 是一款开源软件, 直接编译运行: 美工还是不错的! 控件操作非常简单: void MainWindow::timerEvent( QTimer ...
- Expression Blend学习四控件
原文:Expression Blend学习四控件 Expression Blend制作自定义按钮 1.从Blend工具箱中添加一个Button,按住shift,将尺寸调整为125*125; 2.右键点 ...
- Expression Blend学习5控件
原文:Expression Blend学习5控件 Expression Blend ButtonStyle- TextButton 本章以TextButton为例,讲解如何最简单,最快速的制作一个专业 ...
- Delphi 7学习开发控件(继承TGraphicControl只画一条线)
我们知道使用Delphi快速开发,很大的一方面就是其强大的VCL控件,另外丰富的第三方控件也使得Delphi程序员更加快速的开发出所需要的程序.在此不特别介绍一些概念,只记录自己学习开发控件的步骤.假 ...
- paper 139:qt超强绘图控件qwt - 安装及配置
qwt是一个基于LGPL版权协议的开源项目, 可生成各种统计图.它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式 ...
随机推荐
- 12 IO流
File类:构造方法 * File(String pathname):根据一个路径得到File对象 * File(String parent, String child):根据一个目录和一 ...
- dijksta 模板
#include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f ]; ]; ][]; void dijkstra(i ...
- c++期末考
1. 谁不及格? Problem:A Time Limit:1000ms Memory Limit:65535K Description 聪聪的班主任王老师最近有点忙,可是他又是一位非常细心的老师,每 ...
- 【spring源码分析】spring ioc容器之前生今世--DefaultListableBeanFactory源码解读
spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说, DefaultL ...
- 依赖注入的方式测试ArrayList和LinkedList的效率(对依赖注入的再次理解)
9/20 号再进行学习 在C++中,main函数尽可能的简单,只要调用子函数的一句话就实现了功能. java开发中,controller就相同于是main函数,其他类的方法不在本类中时候, 1.可以用 ...
- Benchmarking Zeebe: An Intro to How Zeebe Scales Horizontally and How We Measure It
Written by Felix Müller and Mike Winters on Jun 12 2018 in the Inside Zeebe category. In the past fe ...
- Singer 学习八 运行&&开发taps、targets (三 开发tap)
如何没有找到适合的tap,那么我们可以自己开发一个 hello world tap 仅仅是一个程序,我们可以使用任何语言进行编写,根据singer 指南,输出数据到stdout 即可,实际上一个简单的 ...
- Makefile introduction (very old presentation)
- 05C++引用
1.变量名 变量名实质上是一段连续存储空间的别名,是一个标号(门牌号): 通过变量来申请并命名内存空间: 通过变量的名字可以使用内存空间. 2.引用的概念 变量名,本身是一段内存的引用,即别名(ali ...
- laya的UI编辑器
//加载一个图集 Laya.loader.load("res/atlas/comp.json",Handler.create(this,this.onLoaderComp), Ha ...