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";
}