Литмир - Электронная Библиотека
Содержание  
A
A

QListView

Списки и деревья в комплекте Qt формируются виджетом

QListView
. Этот виджет представляет как простые списки, так и иерархические данные, разделенные на строки и столбцы. Он очень подходит для вывода структур каталогов или чего-то подобного, потому что дочерние элементы можно раскрыть и свернуть, щелкнув кнопкой мыши знак "плюс" или "минус", так же как в файловом обозревателе.

В отличие от виджета GTK+

ListView
виджет
QListView
обрабатывает и данные, и их представление, что сделано для облегчения использования, если не для исключительной гибкости.

В виджете

QListView
можно выбрать строки или отдельные ячейки и затем вырезать и вставить данные, отсортировать их по столбцу и вы получите виджеты
QCheckBox
, отображенные в ячейках. В этот виджет встроено множество функциональных возможностей — как программисту вам достаточно лишь вставить данные и задать некоторые правила форматирования.

Создается виджет

QListView
обычным образом, заданием родительского виджета и собственного имени виджета:

QListView *view = new QListView(parent, "name");

Для задания заголовков столбцов используйте соответствующим образом названный метод

addColumn
:

view->addColumn("Left Column", width1); // фиксированной ширины

view->addColumn("Right Column"); // с автоматически задаваемым размером

Ширина столбца задается в пикселах или, если пропущена, приравнивается к величине самого длинного элемента в столбце. В дальнейшем при вставке и удалении элементов ширина столбца автоматически меняется.

Данные вставляются в

QListView
с помощью объекта
QListViewItem
, представляющего строку данных. Вы должны лишь передать в конструктор объект
QListView
и элементы строки, и она добавится в конец представления:

QListViewItem *toplevel = new QListViewItem(view, "Left Data", "Right Data");

Первый параметр — либо объект

QListView
, как в данном случае, либо еще один объект типа
QListViewItem
. Если передается
QListViewItem
, строка создается как дочерняя по отношению к этому объекту
QListViewItem
. Таким образом, структура дерева формируется передачей объекта
QListView
для узлов верхнего уровня и затем последующих объектов типа
QListViewItem
для дочерних или подчиненных узлов.

Остальные параметры — данные каждого столбца, по умолчанию равные

NULL
, если не заданы.

Добавление дочернего узла — это просто вариант передачи в функцию указателя верхнего уровня. Если вы не добавляете последующие дочерние узлы в объект

QListViewItem
, нет необходимости сохранять возвращаемый указатель:

new QListViewItem(toplevel, "Left Data", "Right Data");

// Дочерний по отношению к верхнему уровню

В API

QListViewItem
можно найти методы обхода узлов дерева на случай корректировки конкретных строк:

<b>#include &lt;qlistview.h&gt;</b>

<b>virtual void insertItem(QListviewitem* newChild);</b>

<b>virtual void setText(int column, const QString&amp; text);</b>

<b>virtual QString text(int column) const;</b>

<b>QListViewItem* firstChild() const;</b>

<b>QListViewItem* nextSibling() const;</b>

<b>QListViewItem* parent() const;</b>

<b>QListViewItem* itemAbove();</b>

<b>QListViewItem *itemBelow();</b>

Получить первую строку в дереве можно, вызвав метод

firstChild
для самого объекта
QListView
. Затем можно многократно вызывать
firstChild
и
nextSibling
для возврата фрагментов или целого дерева.

Приведенный далее фрагмент программного кода выводит первый столбец всех узлов верхнего уровня:

QListViewItem *child = view-&gt;firstChild();

while(child) {

 cout &lt;&lt; myChild-&gt;text(1) &lt;&lt; &quot;\n&quot;;

 myChild = myChild-&gt;nextSibling();

}

Все подробности, касающиеся

QListView
,
QListViewItem
и
QCheckListView
, см. в документации API комплекта Qt.

Выполните упражнение 17.7.

Упражнение 17.7 Виджет
QListView

В этом упражнении вы соберете все вместе и напишете короткий пример использования виджета QListView.

Давайте для краткости пропустим заголовочный файл и рассмотрим реализацию класса, файл ListView.cpp.

#include &quot;Listview.moc&quot;

ListView::ListView(QWidget *parent, const char *name) :

 QMainWindow(parent, name) {

 listview = new QListView(this, &quot;listview1&quot;);

 listview-&gt;addColumn(&quot;Artist&quot;);

 listview-&gt;addColumn(&quot;Title&quot;);

 listview-&gt;addColumn(&quot;Catalogue&quot;);

 listview-&gt;setRootIsDecorated(TRUE);

 QListViewItem* toplevel = new QListViewItem(listview, &quot;Avril Lavigne&quot;,

  &quot;Let Go&quot;, &quot;AVCD01&quot;);

 new QListViewItem(toplevel, &quot;Complicated&quot;);

 new QListViewItem(toplevel, &quot;Sk8er Boi&quot;);

 setCentralWidget(listview);

}

int main(int argc, char **argv) {

 QApplication app(argc, argv);

310
{"b":"285844","o":1}