QListWIdget、QTreeWidget

1. QListWiget控件

1.1 添加条目

//添加条目

void addItem(const QString &label)

ui->listWidget->addItem("条目1");

void addItems(const QStringList &labels)

	QStringList items;
    items << "条目2" << "条目3" << "条目4";
    ui->listWidget->addItems(items);

void addItem(QListWidgetItem *item)
QListWidgetItem的构造函数:
1.QListWidgetItem(QListWidget *parent = nullptr, int type = Type)
2.QListWidgetItem(const QString &text, QListWidget *parent = nullptr, int type = Type)
3.QListWidgetItem(const QIcon &icon, const QString &text, QListWidget *parent = nullptr, int type = Type)
4.QListWidgetItem(const QListWidgetItem &other)

	ui->listWidget->addItem(new QListWidgetItem(QIcon(":/1.jpg"),"zix pic"));

//插入条目
void insertItem(int row, QListWidgetItem *item)
void insertItem(int row, const QString &label)
void insertItems(int row, const QStringList &labels)

//获取当前条目
QListWidgetItem *currentItem() const
//获取当前行号
int currentRow() const
//
int row(const QListWidgetItem *item) const

void MainWindow::on_listWidget_doubleClicked(const QModelIndex &index)
{
    qDebug() << index.row();
    qDebug() << index.data().toString();

    qDebug() << ui->listWidget->currentRow();
    qDebug() << ui->listWidget->currentIndex().row();

//  QListWidgetItem *  currentItem() const
    QListWidgetItem * item = ui->listWidget->currentItem();
}

//重要信号Signals
void itemClicked(QListWidgetItem *item)
void itemDoubleClicked(QListWidgetItem *item)

1.2 添加自定义条目

创建自定义窗口条目的步骤:
第一步:创建一个类继承于QWidget
第二步:可以利用qt设计师来设计界面或者手动创建一个布局界面

//自己创建一个布局
void MainWindow::on_addBtn_clicked()
{
    QPushButton *btn = new QPushButton("按钮");
    QListWidgetItem *item = new QListWidgetItem("条目1");
    //给控件添加条目
    ui->listWidget->addItem(item);
    //给条目设置一个组件
    ui->listWidget->setItemWidget(item,btn);

	//当按键按下,去响应事件
    connect(btn,&QPushButton::clicked,
            this,&MainWindow::btn_clicked);
}
//用qt设计师创建ItemForm类
void MainWindow::on_addCustomItemBtn_clicked()
{
    ItemForm *form = new ItemForm();
    //qDebug() << form->sizeHint().height() << " " << form->sizeHint().width();

    QListWidgetItem *item = new QListWidgetItem();
    QSize size(400,120);
    //item的大小要和form保持一致
//    item->setSizeHint(form->sizeHint());
    item->setSizeHint(size);

    ui->listWidget->addItem(item);
    ui->listWidget->setItemWidget(item,form);
}

void MainWindow::btn_clicked()
{
    qDebug() << "按钮按下";
}

1.3 QListWidget、QFileDialog应用

1.打开一个文件夹,若是文件添加条目(文件图标,名字,大小),若是文件夹添加条目(文件夹图标,名字)。
所使用的相关接口:

1.获取文件夹
[static] QString QFileDialog::getExistingDirectory(QWidget *parent, 
													const QString &caption, 
													const QString &dir, 
													QFileDialog::Options options)
2.QDir构造函数
QDir(const QDir &dir)
QDir(const QString &path = QString())
QDir(const QString &path, const QString &nameFilter,
 					      QDir::SortFlags sort = SortFlags(Name | IgnoreCase),
  					      QDir::Filters filters = AllEntries)

3.获取文件信息列表
QFileInfoList entryInfoList(const QStringList &nameFilters, 
							QDir::Filters filters = NoFilter, 
							QDir::SortFlags sort = NoSort) const
QFileInfoList entryInfoList(QDir::Filters filters = NoFilter, 
							QDir::SortFlags sort = NoSort) const
QStringList entryList(const QStringList &nameFilters,
							QDir::Filters filters = NoFilter, 
							QDir::SortFlags sort = NoSort) const
QStringList entryList(QDir::Filters filters = NoFilter, 
					  QDir::SortFlags sort = NoSort) const
4.判断是否是文件或者文件夹
是否是文件夹:bool QFileInfo::isDir() const
Returns true if this object points to a directory or to a symbolic link to a directory;
otherwise returns false.	
是否是文件:bool QFileInfo::isFile() const
Returns true if this object points to a file or to a symbolic link to a file. 
Returns false if the object points to something which isn't a file, such as a directory.		
5.给item条目设置size
void QListWidgetItem::setSizeHint(const QSize &size)
6.添加条目 设置条目窗口
void QListWidget::addItem(QListWidgetItem *item)	
void QListWidget::setItemWidget(QListWidgetItem *item, QWidget *widget)									

主要代码

//mainwindow.cpp
void MainWindow::on_openBtn_clicked()
{
    //返回的是一个目录的路径
    QString dirstr = QFileDialog::getExistingDirectory(this);
    ui->lineEdit->setText(dirstr);

    QDir dir(ui->lineEdit->text());
    QFileInfoList infos = dir.entryInfoList();

    qDebug() << infos.count() << " " << infos.size();

    for(int i=0;i<infos.count();i++)
    {
        //每遍历一次,就创建一个条目
        QListWidgetItem *item = new QListWidgetItem();
        FileForm *w = new FileForm();

        if(infos.at(i).isDir())
        {
            w->setDir(infos.at(i).fileName());
        }else if(infos.at(i).isFile())
        {
            w->setFile(infos.at(i).fileName(),infos.at(i).size());
        }
        QSize size(529,45);
        item->setSizeHint(size);

        //给控件设置一个条目
        ui->listWidget->addItem(item);
        //给item设置一个窗口
        ui->listWidget->setItemWidget(item,w);
    }
}

//fileform.cpp
void FileForm::setFile(QString filename, qint32 size)
{
    QPixmap map(":/img/1.PNG");
    map = map.scaled(ui->iconLabel->size());
    ui->iconLabel->setPixmap(map);
    ui->sizeLabel->setText(QString::number(size));
    ui->nameLabel->setText(filename);
}

void FileForm::setDir(QString dirname)
{
    QPixmap map(":/img/2.PNG");
    map = map.scaled(ui->iconLabel->size());
    ui->iconLabel->setPixmap(map);
    ui->nameLabel->setText(dirname);
}

在这里插入图片描述
2.添加多个文件,根据文件的后缀属性,添加条目(图标,名字)
相关接口

1.判断末尾字符串
bool endsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
bool endsWith(const QStringRef &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
bool endsWith(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
bool endsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
bool endsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const

主要代码

void MainWindow::on_actionopen_triggered()
{
    QStringList list = QFileDialog::getOpenFileNames(this);

    for(int i=0;i<list.count();i++)
    {
        QString filepath = list.at(i);
        QFileInfo info(filepath);
        QString filename = info.fileName();

        //每遍历一次增加一个条目
        if(filename.endsWith(".h"))
        {
            ui->listWidget->addItem(new QListWidgetItem(QIcon(":/pic/2.PNG"),filename,ui->listWidget));
        }else if(filename.endsWith(".cpp"))
        {
            ui->listWidget->addItem(new QListWidgetItem(QIcon(":/pic/1.PNG"),filename,ui->listWidget));
        }else if(filename.endsWith(".o"))
        {
            ui->listWidget->addItem(new QListWidgetItem(QIcon(":/pic/3.PNG"),filename,ui->listWidget));
        }
    }
}

在这里插入图片描述

2. QTreeWidget控件

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QTreeWidgetItem>
#include <QtDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //设置一个头标签
//    void setHeaderLabel(const QString &label)
    //设置多个头标签
//    void setHeaderLabels(const QStringList &labels)
//    ui->treeWidget->setHeaderLabel("zix");
//    ui->treeWidget->setHeaderLabel("zix1");
    QStringList labels;
    labels << "zix" << "lay" << "cherry" << "roy";
    ui->treeWidget->setHeaderLabels(labels);

    QTreeWidgetItem *item1 = new QTreeWidgetItem(ui->treeWidget);
    item1->setText(0,"zix1");
    item1->setText(1,"zix2");
    item1->setText(2,"zix3");
    item1->setText(3,"zix4");

    ui->treeWidget->addTopLevelItem(item1);

    QTreeWidgetItem *item2 = new QTreeWidgetItem(ui->treeWidget);
    item2->setText(0,"zix1");
    item2->setText(1,"zix2");
    item2->setText(2,"zix3");
    item2->setText(3,"zix4");

    QTreeWidgetItem *item3 = new QTreeWidgetItem(item2);
    item3->setText(0,"zixxx");
    item3->setText(2,"zixxx");

    connect(ui->treeWidget,&QTreeWidget::doubleClicked,
            this,&MainWindow::treeWidgetDoubleClicked);
}

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

void MainWindow::treeWidgetDoubleClicked()
{
    qDebug() << "treeWidgetDoubleClicked";
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值