跟我一起學QT_QlistWidget控件的使用

QListWidget 簡介

QListWidget類提供了一個基于項目的列表小部件
QListWidget是一個方便的類嘀韧,它提供了一個列表視圖,類似于QListView提供的列表視圖酗洒,但是具有一個用于添加和刪除項的經(jīng)典基于項的接口。QListWidget使用一個內(nèi)部模型來管理列表中的每個QListWidgetItem裁眯。要獲得更靈活的列表視圖小部件啤咽,請使用帶有標準模型的QListView類。列表小部件的構造方法與其他小部件相同

設置多選還是單選

QListWidget selectionMode()確定可以同時選擇列表中的多少項廓奕,以及是否可以創(chuàng)建復雜的項選擇抱婉。這可以使用setSelectionMode()函數(shù)設置
首先selectionMode()成員函數(shù)返回一個枚舉類型我們可以根據(jù)這個枚舉類型來判斷我們的listwidget是否支持多選
下面我們看一下 這個枚舉類型的原型

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

QAbstractItemView::SingleSelection表示 當用戶選擇一個項目時,任何已經(jīng)選擇的項目都將變?yōu)槲催x擇桌粉。用戶可以取消選定的項蒸绩。

QAbstractItemView::ContiguousSelection 當用戶以通常的方式選擇一個項目時,將清除該選擇并選擇新項目铃肯。但是患亿,如果用戶在單擊項時按下Shift鍵,則根據(jù)所單擊項的狀態(tài)押逼,選擇或取消當前項和所單擊項之間的所有項步藕。

QAbstractItemView::ExtendedSelection 當用戶以通常的方式選擇一個項目時,將清除該選擇并選擇新項目宴胧。但是,如果用戶在單擊一個項目時按下Ctrl鍵表锻,則單擊的項目將被切換恕齐,所有其他項目將保持不變。如果用戶在單擊項時按下Shift鍵瞬逊,則根據(jù)所單擊項的狀態(tài)選擇或不選擇當前項和所單擊項之間的所有項显歧。可以通過拖動鼠標來選擇多個項目确镊。

QAbstractItemView::MultiSelection 當用戶以通常的方式選擇一個項目時士骤,該項目的選擇狀態(tài)將被切換,其他項目將保持不變蕾域。多個項目可以通過拖動鼠標來切換拷肌。

QAbstractItemView::NoSelection 無法選擇項到旦。

添加Items

向列表添加項有兩種方法:可以使用列表小部件作為父小部件構造它們,或者不使用父小部件構造它們巨缘,然后將它們添加到列表中添忘。如果在構建項目時列表小部件已經(jīng)存在,那么第一個方法更容易使用:

/*第一種 創(chuàng)建的時候設置父類的*/
new QListWidgetItem(tr("Oak"), listWidget);
new QListWidgetItem(tr("Fir"), listWidget);
new QListWidgetItem(tr("Pine"), listWidget);
/*第二種直接用ListWidget的成員函數(shù)添加*/
QListWidgetItem *newItem = new QListWidgetItem;
newItem->setText(itemText);
listWidget->insertItem(row, newItem);



對于多個項目若锁,可以使用insertItems()搁骑。列表中的項數(shù)可以通過count()函數(shù)找到。要從列表中刪除項又固,請使用takeItem()仲器。列表中的當前項可以用currentItem()找到,也可以用setCurrentItem()更改仰冠。用戶還可以通過使用鍵盤導航或單擊其他項來更改當前項乏冀。當當前項更改時,currentItemChanged()信號將與新的當前項和先前的當前項一起發(fā)出沪停。

實戰(zhàn)代碼

前面講了那么多我們也大致了解怎么去使用這個控件了 那么下面我就實際操作寫一個ListWidget控件的例子

1.Qt Creator 創(chuàng)建一個帶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 的成員函數(shù) count此屬性保存列表中包含任何隱藏項的項數(shù)木张。
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()


一般情況我們使用無非就是像知道用戶選中某一行或者某一行被選中我們需要處理什么


下面我直接用簡單的代碼實現(xiàn)下
首先我們定義一個 來處理 QListWidget::currentRowChanged信號的 的槽函數(shù)

#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:
    /*
    先定一個初始化的函數(shù)
    */
    void InitListItem();
public slots:
    /*新建一個當用戶選中的項發(fā)送改變時的槽函數(shù)*/
    void CurrentChanged(int CurrentRow);
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H



然后實現(xiàn)的代碼如下

#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 連接信號和槽函數(shù)*/
    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)
{
    //我們也不做過多的操作我們可以獲取打印出當前選中的項目的文本數(shù)據(jù)
    if(CurrentRow!=-1)
    {
        QListWidgetItem* item =  ui->listWidget->item(CurrentRow);
        qDebug() << "Are you currently selected :" << item->text();
    }
}



當然最后的效果如下圖

result

如果需要研究QListWidget 的其他用法可以參考QT的幫助手冊


今天的和我一起學QT就先介紹到這里

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末众辨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子舷礼,更是在濱河造成了極大的恐慌鹃彻,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妻献,死亡現(xiàn)場離奇詭異蛛株,居然都是意外死亡,警方通過查閱死者的電腦和手機育拨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門谨履,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人熬丧,你說我怎么就攤上這事笋粟。” “怎么了析蝴?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵害捕,是天一觀的道長。 經(jīng)常有香客問我闷畸,道長尝盼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任佑菩,我火速辦了婚禮盾沫,結果婚禮上裁赠,老公的妹妹穿的比我還像新娘。我一直安慰自己疮跑,他們只是感情好组贺,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著祖娘,像睡著了一般失尖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渐苏,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天掀潮,我揣著相機與錄音,去河邊找鬼琼富。 笑死仪吧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的鞠眉。 我是一名探鬼主播薯鼠,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼械蹋!你這毒婦竟也來了出皇?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤哗戈,失蹤者是張志新(化名)和其女友劉穎郊艘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唯咬,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡纱注,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了胆胰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狞贱。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蜀涨,靈堂內(nèi)的尸體忽然破棺而出瞎嬉,到底是詐尸還是另有隱情,我是刑警寧澤勉盅,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布佑颇,位于F島的核電站顶掉,受9級特大地震影響草娜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痒筒,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一宰闰、第九天 我趴在偏房一處隱蔽的房頂上張望茬贵。 院中可真熱鬧,春花似錦移袍、人聲如沸解藻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽螟左。三九已至,卻和暖如春觅够,著一層夾襖步出監(jiān)牢的瞬間胶背,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工喘先, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钳吟,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓窘拯,卻偏偏與公主長得像红且,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子涤姊,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348