在我们从最简单的QListWidget、QTreeWidget和QTableWidget三个类开始了解最简单的 model/view 的使用。
我们要介绍的第一个是QListWidget
。先来看下面的代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| label = new QLabel(this); label->setFixedWidth(70);
listWidget = new QListWidget(this);
new QListWidgetItem(QIcon(":/Chrome.png"), tr("Chrome"), listWidget); new QListWidgetItem(QIcon(":/Firefox.png"), tr("Firefox"), listWidget);
listWidget->addItem(new QListWidgetItem(QIcon(":/IE.png"), tr("IE"))); listWidget->addItem(new QListWidgetItem(QIcon(":/Netscape.png"), tr("Netscape"))); listWidget->addItem(new QListWidgetItem(QIcon(":/Opera.png"), tr("Opera"))); listWidget->addItem(new QListWidgetItem(QIcon(":/Safari.png"), tr("Safari"))); listWidget->addItem(new QListWidgetItem(QIcon(":/TheWorld.png"), tr("TheWorld"))); listWidget->addItem(new QListWidgetItem(QIcon(":/Traveler.png"), tr("Traveler")));
QListWidgetItem *newItem = new QListWidgetItem; newItem->setIcon(QIcon(":/Maxthon.png")); newItem->setText(tr("Maxthon")); listWidget->insertItem(3, newItem);
QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(label); layout->addWidget(listWidget);
setLayout(layout);
connect(listWidget, SIGNAL(currentTextChanged(QString)), label, SLOT(setText(QString)));
|
向listWidget
添加列表项可以:第一,使用下面的语句
1
| new QListWidgetItem(QIcon(":/Chrome.png"), tr("Chrome"), listWidget);
|
第二,使用
1 2 3 4 5 6
| listWidget->addItem(new QListWidgetItem(QIcon(":/IE.png"), tr("IE"))); // 或者 QListWidgetItem *newItem = new QListWidgetItem; newItem->setIcon(QIcon(":/Maxthon.png")); newItem->setText(tr("Maxthon")); listWidget->insertItem(3, newItem);
|
注意这两种添加方式的区别:第一种需要在构造时设置所要添加到的QListWidget
对象;第二种方法不需要这样设置,而是要调用addItem()
或者insertItem()
自行添加。如果你仔细查阅QListWidgetItem
的构造函数,会发现有一个默认的type
参数。该参数有两个合法值:QListWidgetItem::Type(默认
)和QListWidgetItem::UserType
。如果我们继承QListWidgetItem,可以设置该参数,作为我们子类的一种区别,以便能够在QListWidget
区别处理不同子类。
我们要介绍的第二个组件是QTreeWidget
。顾名思义,这是用来展示树型结构(也就是层次结构)的。同前面说的QListWidget
类似,这个类需要同另外一个辅助类QTreeWidgetItem
一起使用。不过,既然是提供方面的封装类,即便是看上去很复杂的树,在使用这个类的时候也是显得比较简单的。当不需要使用复杂的QTreeView
特性的时候,我们可以直接使用QTreeWidget
代替。
下面我们使用代码构造一棵树:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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
添加QTreewidgetItem
。QTreewidgetItem
有很多重载的构造函数。其中一个,
1
| QTreeWidgetItem(QTreeWidget *parent, const QStringList &strings, int type = Type);
|
这里有三个参数,第一个参数用于指定这个项属于哪一个树,类似前面的QListWidget
,如果指定了这个值,则意味着该项被直接添加到树中;第二个参数指定显示文字;第三个参数指定其类型,同QListWidgetItem
的type
参数十分类似。第二个参数是QStringList
类型的,而不是QString
类型的。