跟我一起学QT_QlistWidget控件的使用

QListWidget 简介

QListWidget类提供了一个基于项目的列表小部件
QListWidget是一个方便的类,它提供了一个列表视图,类似于QListView提供的列表视图,但是具有一个用于添加和删除项的经典基于项的接口。QListWidget使用一个内部模型来管理列表中的每个QListWidgetItem。要获得更灵活的列表视图小部件,请使用带有标准模型的QListView类。列表小部件的构造方法与其他小部件相同

设置多选还是单选

QListWidget selectionMode()确定可以同时选择列表中的多少项,以及是否可以创建复杂的项选择。这可以使用setSelectionMode()函数设置
首先selectionMode()成员函数返回一个枚举类型我们可以根据这个枚举类型来判断我们的listwidget是否支持多选
下面我们看一下 这个枚举类型的原型

enum QAbstractItemView::SelectionMode
{
QAbstractItemView::SingleSelection = 1,
QAbstractItemView::ContiguousSelection = 4,
QAbstractItemView::ExtendedSelection = 3,
QAbstractItemView::MultiSelection = 2,
QAbstractItemView::NoSelection = 0
};

QAbstractItemView::SingleSelection表示 当用户选择一个项目时,任何已经选择的项目都将变为未选择。用户可以取消选定的项。

QAbstractItemView::ContiguousSelection 当用户以通常的方式选择一个项目时,将清除该选择并选择新项目。但是,如果用户在单击项时按下Shift键,则根据所单击项的状态,选择或取消当前项和所单击项之间的所有项。

QAbstractItemView::ExtendedSelection 当用户以通常的方式选择一个项目时,将清除该选择并选择新项目。但是,如果用户在单击一个项目时按下Ctrl键,则单击的项目将被切换,所有其他项目将保持不变。如果用户在单击项时按下Shift键,则根据所单击项的状态选择或不选择当前项和所单击项之间的所有项。可以通过拖动鼠标来选择多个项目。

QAbstractItemView::MultiSelection 当用户以通常的方式选择一个项目时,该项目的选择状态将被切换,其他项目将保持不变。多个项目可以通过拖动鼠标来切换。

QAbstractItemView::NoSelection 无法选择项。

添加Items

向列表添加项有两种方法:可以使用列表小部件作为父小部件构造它们,或者不使用父小部件构造它们,然后将它们添加到列表中。如果在构建项目时列表小部件已经存在,那么第一个方法更容易使用:

/*第一种 创建的时候设置父类的*/
new QListWidgetItem(tr("Oak"), listWidget);
new QListWidgetItem(tr("Fir"), listWidget);
new QListWidgetItem(tr("Pine"), listWidget);
/*第二种直接用ListWidget的成员函数添加*/
QListWidgetItem *newItem = new QListWidgetItem;
newItem->setText(itemText);
listWidget->insertItem(row, newItem);



对于多个项目,可以使用insertItems()。列表中的项数可以通过count()函数找到。要从列表中删除项,请使用takeItem()。列表中的当前项可以用currentItem()找到,也可以用setCurrentItem()更改。用户还可以通过使用键盘导航或单击其他项来更改当前项。当当前项更改时,currentItemChanged()信号将与新的当前项和先前的当前项一起发出。

实战代码

前面讲了那么多我们也大致了解怎么去使用这个控件了 那么下面我就实际操作写一个ListWidget控件的例子

1.Qt Creator 创建一个带UI的项目

image

2、添加如下代码分别用两种方式插入我们需要插入的项

#include "MainWindow.h"
#include "ui_mainwindow.h"
#include <QListWidget>
#include <QListWidgetItem>
#include <QString>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    /*
    使用listwidget
    */
    InitListItem();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::InitListItem()
{
    /*先用第一种方式初始化*/
    for(int i = 0 ; i<10; i++)
    {
        QString str = QString("Item %1").arg(i);
        qDebug() << str << endl;
        new QListWidgetItem(str,ui->listWidget);
    }
    /*第二种初始化方式*/
    for (int l = 10;l<20;l++)
    {
        QString str = QString("2item %1").arg(l);
        QListWidgetItem* iTems = new QListWidgetItem(str);
        ui->listWidget->addItem(iTems);
    }
}



效果图就像这样

效果


3、下面我们来深入研究下QListWidget这个控件

QListWidget 的成员函数 count此属性保存列表中包含任何隐藏项的项数。
currentRow获取当前选择的行 setCurrentRow(int row) 是设置选中行


QListWidget 有如下信号

void
currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
void
currentRowChanged(int currentRow)
void
currentTextChanged(const QString &currentText)
void
itemActivated(QListWidgetItem *item)
void
itemChanged(QListWidgetItem *item)
void
itemClicked(QListWidgetItem *item)
void
itemDoubleClicked(QListWidgetItem *item)
void
itemEntered(QListWidgetItem *item)
void
itemPressed(QListWidgetItem *item)
void
itemSelectionChanged()


一般情况我们使用无非就是像知道用户选中某一行或者某一行被选中我们需要处理什么


下面我直接用简单的代码实现下
首先我们定义一个 来处理 QListWidget::currentRowChanged信号的 的槽函数

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
public:
    /*
    先定一个初始化的函数
    */
    void InitListItem();
public slots:
    /*新建一个当用户选中的项发送改变时的槽函数*/
    void CurrentChanged(int CurrentRow);
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H



然后实现的代码如下

#include "MainWindow.h"
#include "ui_mainwindow.h"
#include <QListWidget>
#include <QListWidgetItem>
#include <QString>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    /*
    使用listwidget
    */
    InitListItem();
    /*用connect 连接信号和槽函数*/
    QObject::connect(ui->listWidget,&QListWidget::currentRowChanged,this,&MainWindow::CurrentChanged);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::InitListItem()
{
    /*先用第一种方式初始化*/
    for(int i = 0 ; i<10; i++)
    {
        QString str = QString("Item %1").arg(i);
        qDebug() << str << endl;
        new QListWidgetItem(str,ui->listWidget);
    }
    /*第二种初始化方式*/
    for (int l = 10;l<20;l++)
    {
        QString str = QString("2item %1").arg(l);
        QListWidgetItem* iTems = new QListWidgetItem(str);
        ui->listWidget->addItem(iTems);
    }
}

void MainWindow::CurrentChanged(int CurrentRow)
{
    //我们也不做过多的操作我们可以获取打印出当前选中的项目的文本数据
    if(CurrentRow!=-1)
    {
        QListWidgetItem* item =  ui->listWidget->item(CurrentRow);
        qDebug() << "Are you currently selected :" << item->text();
    }
}



当然最后的效果如下图

result

如果需要研究QListWidget 的其他用法可以参考QT的帮助手册


今天的和我一起学QT就先介绍到这里

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352