Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 57

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

ΠœΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с создания ΠΈ заполнСния ΠΌΠΎΠ΄Π΅Π»ΠΈ QStringListModel. Π—Π°Ρ‚Π΅ΠΌ создадим прСдставлСниС QListView ΠΈ свяТСм Π΅Π³ΠΎ с Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ созданной модСлью. Установим Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΠΈ рСдактирования, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строку, просто вводя символ ΠΈΠ»ΠΈ дСлая Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Ρ‰Π΅Π»Ρ‡ΠΎΠΊ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ всС ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΠΈ рСдактирования ΡΠ±Ρ€ΠΎΡˆΠ΅Π½Ρ‹ для QListView, фактичСски дСлая это прСдставлСниС ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния.

01 void TeamLeadersDialog::insert()

02 {

03 int row = listView->currentIndex().row();

04 model->insertRows(row, 1);

05 QModelIndex index = model->index(row);

07 listView->setCurrentIndex(index);

08 listView->edit(index);

09 }

Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Insert (вставка), вызываСтся слот insert(). Π­Ρ‚ΠΎΡ‚ слот Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ с получСния Π½ΠΎΠΌΠ΅Ρ€Π° строки Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ элСмСнта Π² спискС. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ «индСкс ΠΌΠΎΠ΄Π΅Π»ΠΈΒ», прСдставлСнный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ QModelIndex. ΠœΡ‹ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассмотрим индСксы ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅, Π° Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π°ΠΌ достаточно Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ индСкс ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Ρ€ΠΈ основных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°: строку, столбСц ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° модСль, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚. Π’ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ списка столбСц всСгда Ρ€Π°Π²Π΅Π½ 0.

ИмСя Π½ΠΎΠΌΠ΅Ρ€ строки, ΠΌΡ‹ вставляСм ΠΎΠ΄Π½Ρƒ Π½ΠΎΠ²ΡƒΡŽ строку Π² Π΄Π°Π½Π½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ. Вставка выполняСтся Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΈ модСль автоматичСски обновляСт списковоС прСдставлСниС. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ устанавливаСм Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ индСкс спискового прСдставлСния Π½Π° ΠΏΡƒΡΡ‚ΡƒΡŽ строку, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ вставили. НаконСц, ΠΌΡ‹ устанавливаСм Π² списковом прСдставлСнии Ρ€Π΅ΠΆΠΈΠΌ рСдактирования для Π½ΠΎΠ²ΠΎΠΉ строки, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠ°Π» ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΈΠ»ΠΈ Π΄Π²Π°ΠΆΠ΄Ρ‹ Ρ‰Π΅Π»ΠΊΠ½ΡƒΠ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.

01 void TeamLeadersDialog::del()

02 {

03 model->removeRows(listView->currentIndex().row(), 1);

04 }

Π’ конструкторС сигнал clicked() ΠΊΠ½ΠΎΠΏΠΊΠΈ Delete (ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ) связываСтся со слотом del(). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΡƒΠ΄Π°Π»ΠΈΠ»ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ строку, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ removeRows() для Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ индСкса ΠΈ для значСния 1 счСтчика строк. Как ΠΈ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ вставки, ΠΌΡ‹ полагаСмся Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ модСль Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ прСдставлСниС.

01 QStringList TeamLeadersDialog::leaders() const

02 {

03 return model->stringList();

04 }

НаконСц, функция leaders() позволяСт ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ строки, ΠΊΠΎΠ³Π΄Π° Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎ.

Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ TeamLeadersDialog ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π° основС ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° рСдактирования списка строк, просто парамСтризируя Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ этого ΠΎΠΊΠ½Π°. Π”Ρ€ΡƒΠ³ΠΎΠ΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ список Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ². Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ примСняСтся класс QDirModel, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ систСму ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° ΠΈ позволяСт ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ (ΠΈΠ»ΠΈ ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ) Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Ρ„Π°ΠΉΠ»ΠΎΠ². Π­Ρ‚Π° модСль ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ для ограничСния Ρ‚ΠΈΠΏΠΎΠ² элСмСнтов Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы ΠΏΡ€ΠΈ ΠΈΡ… Π²Ρ‹Π²ΠΎΠ΄Π΅ Π½Π° экран ΠΈ ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΠ²Π°Ρ‚ΡŒ элСмСнты Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ способами.

Рис. 10.7. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.

ΠœΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с создания ΠΈ настройки ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ прСдставлСния Π² конструкторС Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° (Directory Viewer).

01 DirectoryViewer::DirectoryViewer(QWidget *parent)

02 : QDialog(parent)

03 {

04 model = new QDirModel;

05 model->setReadOnly(false);

06 model->setSorting(QDir::DirsFirst | QDir::IgnoreCase | QDir::Name);

07 treeView = new QTreeView;

08 treeView->setModel(model);

09 treeView->header()->setStretchLastSection(true);

10 treeView->header()->setSortIndicator(0, Qt::AscendingOrder);

11 treeView->header()->setSortIndicatorShown(true);

12 treeView->header()->setClickable(true);

13 QModelIndex index = model->index(QDir::currentPath());

14 treeView->expand(index);

15 treeView->scrollTo(index);

16 treeView->resizeColumnToContents(0);

17 …

18 }

ПослС создания ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΡ‹ обСспСчиваСм Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΅Π΅ рСдактирования ΠΈ устанавливаСм Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ упорядочивания. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QTreeView для отобраТСния Π½Π° экранС Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ QTreeView ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ для управлСния сортировкой. ДСлая Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ восприимчивым ΠΊ Ρ‰Π΅Π»Ρ‡ΠΊΠ°ΠΌ ΠΌΡ‹ΡˆΠΊΠΈ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡ€Ρ‚ΠΈΡ€Π±Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌΡƒ ΠΈΠΌ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ столбцу, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Π΅ Ρ‰Π΅Π»Ρ‡ΠΊΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ сортировки, Ρ‚.Π΅ сортировку ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ Π½Π° сортировку ΠΏΠΎ ΡƒΠ±Ρ‹Π²Π°Π½ΠΈΡŽ ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. ПослС настройки Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² прСдставлСния Π΄Π°Π½Π½Ρ‹Ρ… Π² Π²ΠΈΠ΄Π΅ Π΄Π΅Ρ€Π΅Π²Π° ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ индСкс ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈ обСспСчиваСм просмотр содСрТимого этого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, раскрывая ΠΏΡ€ΠΈ нСобходимости Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ expand(), ΠΈ устанавливая ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π΅Π³ΠΎ Π½Π°Ρ‡Π°Π»ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ scrollTo(). Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ обСспСчиваСм ΡˆΠΈΡ€ΠΈΠ½Ρƒ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ столбца, Π΄ΠΎΡΡ‚Π°Ρ‚ΠΎΡ‡Π½ΡƒΡŽ для размСщСния всСх элСмСнтов Π±Π΅Π· Π²Ρ‹Π²ΠΎΠ΄Π° многоточия (…).

Π’ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ конструктора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ здСсь Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½, ΠΌΡ‹ связываСм ΠΊΠ½ΠΎΠΏΠΊΠΈ Create Directory (ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³) ΠΈ Remove (ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ) со слотами, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΌΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия. Нам Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Rename (ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ элСмСнты ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΏΠΎ мСсту, наТимая ΠΊΠ»Π°Π²ΠΈΡˆΡƒ F2 ΠΈ осущСствляя Π²Π²ΠΎΠ΄ символов с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹.

01 voidDirectoryViewer::createDirectory()

02 {

03 QModelIndex index;

04 if (!index.isValid())

05 return;

06 QString dirName = QInputDialog::getText(this,

07 tr("Create Directory"), tr("Directory name"));

08 if (!dirName.isEmpty()) {

09 if (!model->mkdir(index,dirName).isValid())

10 QMessageBox::information(this,

11 tr("Create Directory"),

12 tr("Failed to create the directory"));

13 }

14 }

Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²ΠΎΠ΄ΠΈΡ‚ имя ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ Π²Π²ΠΎΠ΄Π°, ΠΌΡ‹ пытаСмся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с этим ΠΈΠΌΠ΅Π½Π΅ΠΌ. Ѐункция QDirModel::mkdir() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ индСкс Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈ имя Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°; ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ индСкс ΠΌΠΎΠ΄Π΅Π»ΠΈ созданного ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. Если опСрация Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ, возвращаСтся Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ индСкс ΠΌΠΎΠ΄Π΅Π»ΠΈ.

ПослСдний ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ слСдуСт ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ модСль QSortFilterProxyModel. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, эта модСль ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ модСль ΠΈ управляСт Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ проходят ΠΌΠ΅ΠΆΠ΄Ρƒ Π±Π°Π·ΠΎΠ²ΠΎΠΉ модСлью ΠΈ прСдставлСниСм. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±Π°Π·ΠΎΠ²ΠΎΠΉ являСтся модСль QStringListModel, которая ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° списком Π½Π°Π·Π²Π°Π½ΠΈΠΉ Ρ†Π²Π΅Ρ‚ΠΎΠ², распознаваСмых Qt (ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ QColor::colorNames()). ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ввСсти строку Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° Π² строкС рСдактирования QLineEdit ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΅Π΅ Ρ‚ΠΈΠΏ (рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, шаблон ΠΈΠ»ΠΈ фиксированная строка), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠΎΠ»Π΅ с Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΌ списком.

Рис. 10.8. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Названия Ρ†Π²Π΅Ρ‚ΠΎΠ² (ColorNames).

НиТС приводится Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ конструктора ColorNamesDialog:

01 ColorNamesDialog::ColorNamesDialog(QWidget *parent)

02 : QDialog(parent)

03 {

04 sourceModel = new QStringListModel(this);

05 sourceModel->setStringList(QColor::colorNames());

06 proxyModel = new QSortFilterProxyModel(this);

07 proxyModel->setSourceModel(sourceModel);

08 proxyModel->setFilterKeyColumn(0);


09 listView = new QListView;

10 listView->setModel(proxyModel);


11 syntaxComboBox = new QComboBox;

12 syntaxComboBox->addItem(tr("Regular expression"), QRegExp::RegExp);

13 syntaxComboBox->addItem(tr("Wildcard"), QRegExp::Wildcard);

14 syntaxComboBox->addItem(tr("Fixed string"), QRegExp::FixedString);

15 …

16 }

МодСль QStringListModel создаСтся ΠΈ пополняСтся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. ПослС этого создаСтся модСль QSortFilterProxyModel. ΠœΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π±Π°Π·ΠΎΠ²ΡƒΡŽ модСль, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ setSourceModel(), ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ прокси Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ столбцу 0 Π±Π°Π·ΠΎΠ²ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π΄ΠΈ. Ѐункция QComboBox::addItem() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ° QVariant; ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Π³ΠΎ для хранСния значСния QRegExp::PatternSyntax c тСкстом, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΌ Ρ‚ΠΈΠΏ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° Π΄Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта.

01 void ColorNamesDialog::reapplyFilter()

02 {

03 QRegExp::PatternSyntax syntax =

04 QRegExp::PatternSyntax(syntaxComboBox->itemData(

05 syntaxComboBox->currentIndex()).toInt());

06 QRegExp regExp(filterLineEdit->text(), Qt::CaseInsensitive, syntax);

07 proxyModel->setFilterRegExp(regExp);

08 }

Π‘Π»ΠΎΡ‚ reapplyFilter() вызываСтся ΠΏΡ€ΠΈ всяком ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ строки Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏΠ° шаблона Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ Π² ΠΏΠΎΠ»Π΅ с Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΌ списком. ΠœΡ‹ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QRegExp, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ тСкст Π² строкС рСдактирования. Π—Π°Ρ‚Π΅ΠΌ устанавливаСм Ρ‚ΠΈΠΏ шаблона Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ Π½Π° Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ имССтся Π² Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ элСмСнта ΠΈ отобраТаСтся Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΠΎΠ»Π΅ с Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΌ списком. Когда ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ setFilterRegExp(), Π½ΠΎΠ²Ρ‹ΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ становится Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΈ автоматичСски обновляСтся прСдставлСниС Π΄Π°Π½Π½Ρ‹Ρ….