跟我一起學(xué)QT_QlistWidget控件的使用

QListWidget 簡(jiǎn)介

QListWidget類提供了一個(gè)基于項(xiàng)目的列表小部件
QListWidget是一個(gè)方便的類,它提供了一個(gè)列表視圖,類似于QListView提供的列表視圖,但是具有一個(gè)用于添加和刪除項(xiàng)的經(jīng)典基于項(xiàng)的接口。QListWidget使用一個(gè)內(nèi)部模型來(lái)管理列表中的每個(gè)QListWidgetItem。要獲得更靈活的列表視圖小部件,請(qǐng)使用帶有標(biāo)準(zhǔn)模型的QListView類。列表小部件的構(gòu)造方法與其他小部件相同

設(shè)置多選還是單選

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

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

QAbstractItemView::SingleSelection表示 當(dāng)用戶選擇一個(gè)項(xiàng)目時(shí),任何已經(jīng)選擇的項(xiàng)目都將變?yōu)槲催x擇。用戶可以取消選定的項(xiàng)。

QAbstractItemView::ContiguousSelection 當(dāng)用戶以通常的方式選擇一個(gè)項(xiàng)目時(shí),將清除該選擇并選擇新項(xiàng)目。但是,如果用戶在單擊項(xiàng)時(shí)按下Shift鍵,則根據(jù)所單擊項(xiàng)的狀態(tài),選擇或取消當(dāng)前項(xiàng)和所單擊項(xiàng)之間的所有項(xiàng)。

QAbstractItemView::ExtendedSelection 當(dāng)用戶以通常的方式選擇一個(gè)項(xiàng)目時(shí),將清除該選擇并選擇新項(xiàng)目。但是,如果用戶在單擊一個(gè)項(xiàng)目時(shí)按下Ctrl鍵,則單擊的項(xiàng)目將被切換,所有其他項(xiàng)目將保持不變。如果用戶在單擊項(xiàng)時(shí)按下Shift鍵,則根據(jù)所單擊項(xiàng)的狀態(tài)選擇或不選擇當(dāng)前項(xiàng)和所單擊項(xiàng)之間的所有項(xiàng)??梢酝ㄟ^(guò)拖動(dòng)鼠標(biāo)來(lái)選擇多個(gè)項(xiàng)目。

QAbstractItemView::MultiSelection 當(dāng)用戶以通常的方式選擇一個(gè)項(xiàng)目時(shí),該項(xiàng)目的選擇狀態(tài)將被切換,其他項(xiàng)目將保持不變。多個(gè)項(xiàng)目可以通過(guò)拖動(dòng)鼠標(biāo)來(lái)切換。

QAbstractItemView::NoSelection 無(wú)法選擇項(xiàng)。

添加Items

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

/*第一種 創(chuàng)建的時(shí)候設(shè)置父類的*/
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);



對(duì)于多個(gè)項(xiàng)目,可以使用insertItems()。列表中的項(xiàng)數(shù)可以通過(guò)count()函數(shù)找到。要從列表中刪除項(xiàng),請(qǐng)使用takeItem()。列表中的當(dāng)前項(xiàng)可以用currentItem()找到,也可以用setCurrentItem()更改。用戶還可以通過(guò)使用鍵盤導(dǎo)航或單擊其他項(xiàng)來(lái)更改當(dāng)前項(xiàng)。當(dāng)當(dāng)前項(xiàng)更改時(shí),currentItemChanged()信號(hào)將與新的當(dāng)前項(xiàng)和先前的當(dāng)前項(xiàng)一起發(fā)出。

實(shí)戰(zhàn)代碼

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

1.Qt Creator 創(chuàng)建一個(gè)帶UI的項(xiàng)目

image

2、添加如下代碼分別用兩種方式插入我們需要插入的項(xiàng)

#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、下面我們來(lái)深入研究下QListWidget這個(gè)控件

QListWidget 的成員函數(shù) count此屬性保存列表中包含任何隱藏項(xiàng)的項(xiàng)數(shù)。
currentRow獲取當(dāng)前選擇的行 setCurrentRow(int row) 是設(shè)置選中行


QListWidget 有如下信號(hào)

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()


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


下面我直接用簡(jiǎn)單的代碼實(shí)現(xiàn)下
首先我們定義一個(gè) 來(lái)處理 QListWidget::currentRowChanged信號(hào)的 的槽函數(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:
    /*
    先定一個(gè)初始化的函數(shù)
    */
    void InitListItem();
public slots:
    /*新建一個(gè)當(dāng)用戶選中的項(xiàng)發(fā)送改變時(shí)的槽函數(shù)*/
    void CurrentChanged(int CurrentRow);
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H



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



當(dāng)然最后的效果如下圖

result

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


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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容