zoukankan      html  css  js  c++  java
  • Qt QListWidget控件的使用

    Qt提供QListWidget类列表框控件用来加载并显示多个列表项。QListWidgetItem类就是列表项类。

    一般列表框控件中的列表项有两种加载方式:

    • 一种是由用户手动添加的列表项,比如音乐播放器中加载音乐文件的文件列表,每一个音乐文件都是一个列表项。对于这种列表项,用户可以进行增加、删除、单击  以及双击等操作。
    • 一种是由程序员事先编写好,写在程序中供用户选择的列表项,比如餐厅的电子菜单,每一道菜对应一个列表项。对于这种列表项,用户可以进行单机和双击操作(增加和删除操作也是可以进行的,但是一般的点菜系统会屏蔽掉这种功能)。

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

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

                                          程序效果(程序的ui界面根据此设计)

     

    首先是main.cpp源文件

     1 #include <QtGui>
     2 #include <QApplication>
     3 #include "mainwindow.h"
     4 
     5 int main(int argc, char *argv[])
     6 {
     7     QApplication a(argc, argv);
     8     //Qt文本的国际化显示
     9 //    QTextCodec::setCodecForTr(QTextCodec::codecForName("GB18030"));
    10 //    QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB18030"));
    11 //    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB18030"));
    12 
    13     MainWindow w;
    14     w.show();
    15     return a.exec();
    16 }

    其次是mainwindow.h头文件

     1 #ifndef MAINWINDOW_H
     2 #define MAINWINDOW_H
     3 
     4 #include <QMainWindow>
     5 
     6 #include <QtDebug>
     7 #include <QMessageBox>
     8 
     9 #include <QListWidgetItem>      //列表框空间头文件
    10 #include <QFileDialog>          //文件对话框控件
    11 #include <QStringList>          //字符串容器
    12 #include <QDir>                 //目录类头文件
    13 #include <QString>
    14 
    15 namespace Ui {
    16 class MainWindow;
    17 }
    18 
    19 class MainWindow : public QMainWindow
    20 {
    21     Q_OBJECT
    22 
    23 public:
    24     explicit MainWindow(QWidget *parent = 0);
    25     ~MainWindow();
    26 
    27 private:
    28     Ui::MainWindow *ui;
    29 private slots:
    30     void addbtn();
    31     void deletebtn();
    32     void delallbtn();
    33     void addallbtn();
    34     void singleclicked(QListWidgetItem* item);
    35     void doubleclicked(QListWidgetItem* item);
    36 
    37 };
    38 
    39 #endif // MAINWINDOW_H

    最后是mainwindow.cpp源文件

      1 #include "mainwindow.h"
      2 #include "ui_mainwindow.h"
      3 
      4 MainWindow::MainWindow(QWidget *parent) :
      5     QMainWindow(parent),
      6     ui(new Ui::MainWindow)
      7 {
      8     ui->setupUi(this);
      9     this->setWindowTitle(tr("listWidget学习"));   //设置标题框文本
     10     ui->listWidget->setViewMode(QListView::IconMode);   //设置显示模式为图标模式
     11 //    ui->listWidget->setViewMode(QListView::ListMode);   //设置显示模式为列表模式
     12     QObject::connect(ui->AddButton,SIGNAL(clicked()),this,SLOT(addbtn()));
     13     QObject::connect(ui->lineEdit,SIGNAL(returnPressed()),this,SLOT(addbtn()));
     14     QObject::connect(ui->DeleteButton,SIGNAL(clicked()),this,SLOT(deletebtn()));
     15     QObject::connect(ui->DelAllButton,SIGNAL(clicked()),this,SLOT(delallbtn()));
     16     QObject::connect(ui->ShowDirButton,SIGNAL(clicked()),this,SLOT(addallbtn()));
     17 //    QObject::connect(ui->listWidget,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(singleclicked(QListWidgetItem*)));
     18     QObject::connect(ui->listWidget,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,SLOT(doubleclicked(QListWidgetItem*)));
     19 }
     20 
     21 MainWindow::~MainWindow()
     22 {
     23     delete ui;
     24 }
     25 
     26 /***** 添加单个列表项 *****/
     27 void MainWindow::addbtn()
     28 {
     29     QString str = ui->lineEdit->text();     //获取行编辑框文本
     30     QListWidgetItem *item = new QListWidgetItem;
     31     item->setText(str);                     //设置列表项的文本
     32     ui->listWidget->addItem(item);          //加载列表项到列表框
     33 //    delete item;                          //此处若解除注释,将无法添加到列表框
     34 //    item = NULL;
     35     ui->lineEdit->clear();                  //清空行编辑框
     36 }
     37 
     38 /***** 删除单个列表项 *****/
     39 void MainWindow::deletebtn()
     40 {
     41     //获取列表项的指针
     42     QListWidgetItem *item = ui->listWidget->takeItem(ui->listWidget->currentRow());
     43     delete item;        //释放指针所指向的列表项
     44 }
     45 
     46 /***** 删除多个列表项 *****/
     47 void MainWindow::delallbtn()
     48 {
     49     int num = ui->listWidget->count();  //获取列表项的总数目
     50     ui->listWidget->setFocus(); //将光标设置到列表框上,若注释该语句,则删除时,要手动将焦点设置到列表框,即点击列表项
     51     for(int i=0;i<num;i++)
     52     {   //逐个获取列表项的指针,并删除
     53         QListWidgetItem *item = ui->listWidget->takeItem(ui->listWidget->currentRow());
     54         delete item;
     55     }
     56 }
     57 
     58 /***** 添加多个列表项 *****/
     59 void MainWindow::addallbtn()
     60 {
     61     QStringList FileNames = QFileDialog::getOpenFileNames(this,"打开",QDir::currentPath(),"所有文件(*.*);;文本文档(*.txt)");
     62 
     63     //方法1  整体添加
     64 //    ui->listWidget->addItems(FileNames);
     65 
     66     //方法2  逐个添加
     67     int index=0,count=0;
     68 //    QListWidgetItem *item = new QListWidgetItem;  //…………注释1
     69     count = FileNames.count();              //获取打开文件的总数目
     70 
     71 //    for(index = 0;index<count;index++)    //这样会报错,无法先取出栈底元素  //注释2
     72     for(index=count-1;index>=0;index--)     //QList<QString>的数据结构是栈,只能从栈顶取元素
     73    {
     74         QListWidgetItem *item = new QListWidgetItem;
     75         item->setText(FileNames.takeAt(index)); //逐个设置列表项的文本
     76 //        qDebug()<<FileNames.takeAt(index);        //…………注释3
     77         ui->listWidget->addItem(item);      //加载列表项到列表框
     78    }
     79 }
     80 /*
     81 注意事项:
     82 1、QList<QString>的数据结构是栈,只能从栈顶取元素,所以如果将for循环注释掉,
     83 将注释2解开,程序会出错。因为无法首先取出栈底元素,只能从栈顶开始。
     84 2、对于for循环中的takeAt()函数来说,是将index 所指定的索引位置的数据取走,
     85 并不是复制。所以,如果将注释3的打印语句解开的话,数据元素被取走,无法成功打印,程序出错。
     86 3、如果将for循环中的QListWidgetItem *item = new QListWidgetItem;语句注释起来,
     87 并将注释1和注释3解开,就可以打印出字符串列表FileNames中所有的字符串。只是运行程序会发成覆盖,
     88 最终显示在列表框中的列表项是栈底元素(编译时,需要将takeAt()函数注释掉)。
     89 */
     90 
     91 
     92 /***** 列表项单击操作 *****/
     93 void MainWindow::singleclicked(QListWidgetItem* item)
     94 {
     95     QMessageBox::information(this,"单击消息","单击"+item->text());
     96 }
     97 
     98 /***** 列表项双击操作 *****/
     99 void MainWindow::doubleclicked(QListWidgetItem* item)
    100 {
    101     QMessageBox::information(this,"双击消息","双击"+item->text());
    102 }

    一、列表项的显示设置

    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());
    }
  • 相关阅读:
    Phonon
    qt 的mysql的库
    vwmare下安装fedora
    C++标准库
    C#命名空间
    用谷歌Chrome浏览器来当手机模拟器
    Javascript实现ECMAScript 5中的map、reduce和filter函数
    页面变灰实现方案
    jQuery检查元素是否在视口内(屏幕可见区域内)
    兼容浏览器的获取指定元素(elem)的样式属性(name)的方法
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13724464.html
Copyright © 2011-2022 走看看