【Qt笔记】QListWidget、QTreeWidget 和 QTableWidget

上一章咱们了解了 model/view 架构的基本概念。如今咱们从最简单的QListWidgetQTreeWidgetQTableWidget三个类开始了解最简单的 model/view 的使用。这部份内容的确很难组织。首先,从最标准的 model/view 开始,每每会纠结于复杂的代码;可是,若是从简单的 QListWidgetQTreeWidgetQTableWidget开始,因为这三个类都是继承自各自的 view 类,很难避免 model/view 的相关内容。因而,咱们这部分的组织是,首先进行简单的数据显示,更复杂的设置则放在后面的章节。架构

 

QListWidget

咱们要介绍的第一个是QListWidget。先来看下面的代码示例:函数

label = new QLabel(this);
    label->setFixedWidth(70);

    listWidget = new QListWidget(this);

    new QListWidgetItem(QIcon(":/images/Baidu"), tr("Baidu"), listWidget);
    new QListWidgetItem(QIcon(":/images/Chrome"), tr("Chrome"), listWidget);

    listWidget->addItem(new QListWidgetItem(QIcon(":/images/IE"), tr("IE")));
    listWidget->addItem(new QListWidgetItem(QIcon(":/images/Firefox"),tr("Firefox")));
    listWidget->addItem(new QListWidgetItem(QIcon(":/images/Opera"), tr("Opera")));

    QListWidgetItem *newItem = new QListWidgetItem;
    newItem->setIcon(QIcon(":/images/UC"));
    newItem->setText(tr("UC"));
    listWidget->insertItem(3, newItem);

    listWidget->setViewMode(QListView::IconMode);

    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(label);
    layout->addWidget(listWidget);

    setLayout(layout);

    connect(listWidget, SIGNAL(currentTextChanged(QString)),
            label, SLOT(setText(QString)));

QListWidget是简单的列表组件。当咱们不须要复杂的列表时,能够选择QListWidgetQListWidget中能够添加QListWidgetItem类型做为列表项,QListWidgetItem便可以有文本,也能够有图标。上面的代码显示了三种向列表中添加列表项的方法(实际是两种,后两种实际上是同样的),咱们的列表组件是listWidget,那么,向listWidget添加列表项能够:第一,使用下面的语句this

new QListWidgetItem(QIcon(":/images/Chrome"), tr("Chrome"), listWidget);

第二,使用spa

listWidget->addItem(new QListWidgetItem(QIcon(":/images/IE"), tr("IE")));
// 或者
QListWidgetItem *newItem = new QListWidgetItem;
newItem->setIcon(QIcon(":/images/UC"));
newItem->setText(tr("UC"));
listWidget->insertItem(3, newItem);

注意这两种添加方式的区别:第一种须要在构造时设置所要添加到的QListWidget对象;第二种方法不须要这样设置,而是要调用addItem()或者insertItem()自行添加。若是你仔细查阅QListWidgetItem的构造函数,会发现有一个默认的type参数。该参数有两个合法值:QListWidgetItem::Type(默认)和QListWidgetItem::UserType。若是咱们继承QListWidgetItem,能够设置该参数,做为咱们子类的一种区别,以便可以在QListWidget区别处理不一样子类。code

咱们的程序的运行结果以下:对象

咱们能够利用QListWidget发出的各类信号来判断是哪一个列表项被选择,具体细节能够参考文档。另外,咱们也能够改变列表的显示方式。前面的列表是小图标显示,咱们也能够更改成图标显示,只要添加一行语句:继承

listWidget->setViewMode(QListView::IconMode);

结果以下:索引

QTreeWidget

咱们要介绍的第二个组件是QTreeWidget。顾名思义,这是用来展现树型结构(也就是层次结构)的。同前面说的QListWidget相似,这个类须要同另一个辅助类QTreeWidgetItem一块儿使用。不过,既然是提供方面的封装类,即使是看上去很复杂的树,在使用这个类的时候也是显得比较简单的。当不须要使用复杂的QTreeView特性的时候,咱们能够直接使用QTreeWidget代替。资源

下面咱们使用代码构造一棵树:文档

QTreeWidget treeWidget;
treeWidget.setColumnCount(1);

QTreeWidgetItem *root = new QTreeWidgetItem(&treeWidget,
                                            QStringList(QString("Root")));
new QTreeWidgetItem(root, QStringList(QString("Leaf 1")));
QTreeWidgetItem *leaf2 = new QTreeWidgetItem(root, QStringList(QString("Leaf 2")));
leaf2->setCheckState(0, Qt::Checked);

QList<QTreeWidgetItem *> rootList;
rootList << root;
treeWidget.insertTopLevelItems(0, rootList);

treeWidget.show();

首先,咱们建立了一个QTreeWidget实例。而后咱们调用setColumnCount()函数设定栏数。这个函数的效果咱们会在下文了解到。最后,咱们向QTreeWidget添加QTreeWidgetItemQTreeWidgetItem有不少重载的构造函数。咱们在这里看看其中的一个,其他的请自行查阅文档。这个构造函数的签名以下:

QTreeWidgetItem(QTreeWidget *parent, const QStringList &strings, int type = Type);

这里有 3 个参数,第一个参数用于指定这个项属于哪个树,相似前面的QListWidgetItem,若是指定了这个值,则意味着该项被直接添加到树中;第二个参数指定显示的文字;第三个参数指定其类型,同QListWidgetItemtype参数十分相似。值得注意的是,第二个参数是QStringList类型的,而不是QString类型。咱们会在下文了解其含义。

在这段代码中,咱们建立了做为根的QTreeWidgetItemroot。而后添加了第一个叶节点,以后又添加一个,而这个则设置了可选标记。最后,咱们将这个 root 添加到一个QTreeWidgetItem的列表,做为QTreeWidget的数据项。此时你应该想到,既然QTreeWidget接受QList做为项的数据,它就可以支持多棵树的一块儿显示,而不只仅是单根树。下面咱们来看看运行结果:

​​​​​​

从代码来看,咱们可以想象到这个样子,只是这个树的头上怎么会有一个 1?还记得咱们跳过去的那个函数吗?下面咱们修改一下代码看看:

QTreeWidget treeWidget;

QStringList headers;
headers << "Name" << "Number";
treeWidget.setHeaderLabels(headers);

QStringList rootTextList;
rootTextList << "Root" << "0";
QTreeWidgetItem *root = new QTreeWidgetItem(&treeWidget, rootTextList);

new QTreeWidgetItem(root, QStringList() << QString("Leaf 1") << "1");
QTreeWidgetItem *leaf2 = new QTreeWidgetItem(root,
                                   QStringList() << QString("Leaf 2") << "2");
leaf2->setCheckState(0, Qt::Checked);

QList<QTreeWidgetItem *> rootList;
rootList << root;
treeWidget.insertTopLevelItems(0, rootList);

treeWidget.show();

此次咱们没有使用setColumnCount(),而是直接使用QStringList设置了 headers,也就是树的表头。接下来咱们使用的仍是QStringList设置数据。这样,咱们实现的是带有层次结构的树状表格。利用这一属性,咱们能够比较简单地实现相似 Windows 资源管理器的界面。

若是你不须要显示这个表头,能够调用setHeaderHidden()函数将其隐藏。

QTableWidget

咱们要介绍的最后一个是 QTableWidgetQTableWidget并不比前面的两个复杂到哪里去,这点咱们能够从代码看出来:

QTableWidget tableWidget;
tableWidget.setColumnCount(4);
tableWidget.setRowCount(5);

QStringList headers;
headers << "ID" << "Name" << "Age" << "Sex";
tableWidget.setHorizontalHeaderLabels(headers);

tableWidget.setItem(0, 0, new QTableWidgetItem(QString("0001")));
tableWidget.setItem(1, 0, new QTableWidgetItem(QString("0002")));
tableWidget.setItem(2, 0, new QTableWidgetItem(QString("0003")));
tableWidget.setItem(3, 0, new QTableWidgetItem(QString("0004")));
tableWidget.setItem(4, 0, new QTableWidgetItem(QString("0005")));
tableWidget.setItem(0, 1, new QTableWidgetItem(QString("20100112")));

tableWidget.show();

这段代码运行起来是这样子的:

首先咱们建立了QTableWidget对象,而后设置列数和行数。接下来使用一个QStringList,设置每一列的标题。咱们能够经过调用setItem()函数来设置表格的单元格的数据。这个函数前两个参数分别是行索引和列索引,这两个值都是从 0 开始的,第三个参数则是一个QTableWidgetItem对象。Qt 会将这个对象放在第 row 行第 col 列的单元格中。有关QTableWidgetItem的介绍彻底能够参见上面的QListWidgetItemQTreeWidgetItem

相关文章
相关标签/搜索