Рӯйхатҳо
Рӯйхат дар равзана барои чӣ лозим аст
Дар барномаҳои қайдҳо, почта ва мусиқӣ корбар аввал объектро аз рӯйхат интихоб карда, баъд бо он кор мекунад. Танҳо донистани навиштаҳои сатрҳо басанда нест: бояд фаҳмем, ки кадом сатр ҷорӣ аст, кадом сатрҳо муваққатан пинҳонанд ва дар канорҳои рӯйхат чӣ рӯй медиҳад.
QListWidget намоиши рӯйхат ва нигоҳдории элементҳои онро муттаҳид мекунад. Он барои маҷмӯаҳои хурди додаҳо мувофиқ буда, имкон медиҳад ба рафтори интерфейс диққат диҳед. Баъдтар ҳамин фикрҳо дар меъмории «модел — намоиш», ки додаҳоро аз намоиш ҷудо мекунад, низ кор меоянд.
1. Элемент ва рақами он
Ҳар сатри рӯйхат объекти QListWidgetItem аст. Он матн, ҳолати намоёнӣ ва дигар хосиятҳо дорад. Индекси сатр мавқеи ҷории он аст, ки аз сифр оғоз мешавад. Баъди ворид ё хориҷ кардани элемент мавқеи элементҳои баъдӣ тағйир меёбад, бинобар ин рақам шиносаи доимии объект нест.
addItem як элемент ва addItems чанд элементро ба охир илова мекунад; insertItem ба мавқеи муайян мегузорад. count() шумораи элементҳо ва item(i) худи элементро бармегардонад, ки матни онро бо text() мехонед.
from PySide6.QtWidgets import QApplication, QListWidget
app = QApplication.instance() or QApplication([])
lst = QListWidget()
lst.addItems(["Qt", "Python"])
lst.insertItem(1, "JSON")
print(lst.count())
print([lst.item(i).text() for i in range(lst.count())])
Натиҷа:
3
['Qt', 'JSON', 'Python']
Гузоштани JSON Python-ро ба мавқеи навбатӣ кӯчонд. Дар рӯйхат се элемент бо индексҳои 0, 1 ва 2 ҳаст. Мавқеи count() аллакай баъди элементи охирин аст; агар рӯйхат холӣ набошад, индекси охирини дуруст count() - 1 мебошад.
2. Сатри ҷорӣ ва набудани интихоб
Элементи ҷорӣ элементест, ки интерфейс амалро ҳоло ба он вобаста мекунад. Дар ҳолати пешфарзи интихоби ягона он одатан ба сатри интихобшуда мувофиқ аст. currentRow() рақами онро ё -1 ва currentItem() объектро ё None бармегардонад.
from PySide6.QtWidgets import QApplication, QListWidget
app = QApplication.instance() or QApplication([])
lst = QListWidget()
lst.addItems(["A", "B"])
print(lst.currentRow(), lst.currentItem() is None)
lst.currentRowChanged.connect(print)
lst.setCurrentRow(1)
print(lst.currentItem().text())
lst.setCurrentRow(-1)
Натиҷа:
-1 True
1
B
-1
Дар оғоз сатри ҷорӣ нест. setCurrentRow(1) B-ро ҷорӣ карда, currentRowChanged-ро бо адади 1 мебарорад. Гузоштани -1 сатри ҷориро бекор карда, -1-ро ба коркардкунанда медиҳад. Пас слот набояд бе санҷиш ба item(row).text() муроҷиат кунад.
3. Намоёнӣ ва мавҷудият чизҳои гуногунанд
Барои ҷустуҷӯ сатрҳои номувофиқро пинҳон карда, маҷмӯи аслиро нигоҳ доштан қулай аст. setHidden(True) элементро пинҳон мекунад ва setHidden(False) онро бармегардонад. Элементи пинҳон дар рӯйхат мемонад, индекс дорад ва дар count() ҳисоб мешавад.
from PySide6.QtWidgets import QApplication, QListWidget
app = QApplication.instance() or QApplication([])
lst = QListWidget()
lst.addItems(["Qt", "JSON"])
item = lst.item(0)
item.setHidden(True)
print(lst.count(), item.isHidden(), lst.item(1).text())
item.setHidden(False)
print(item.isHidden())
Натиҷа:
2 True JSON
False
Пинҳон кардани сатри аввал JSON-ро ба сатри 0 нагузаронд: индекси он 1 монд. Шумораи умумӣ ҳанӯз ду аст. Агар шумораи натиҷаҳои намоён лозим бошад, онро алоҳида ҳисоб мекунанд; count() ин корро намекунад.
Филтр қоидаи намоёнӣ барои ҳар элемент аст. Ҳангоми дархости нав ҳам сатрҳои пештар намоён ва ҳам пинҳонро аз нав санҷидан лозим аст. Дархости холӣ одатан тамоми рӯйхатро бармегардонад. Пеш аз муқоиса муайян кунед, ки регистр ва фосилаҳо муҳиманд ё не: ин қоидаҳои ҷустуҷӯст, на хосиятҳои QListWidget.
4. Баровардани объект ва дубора гузоштани он
takeItem(row) элементро хориҷ карда, бармегардонад. Ин аз item(row), ки чизеро хориҷ намекунад, фарқ дорад. Объекти баровардашударо бо нигоҳ доштани хосиятҳояш ба мавқеи дигар гузоштан мумкин аст. Мисоли навбатӣ элементи аввалро ба охир мебарад, на ин ки аз матни он элементи нав созад.
from PySide6.QtWidgets import QApplication, QListWidget
app = QApplication.instance() or QApplication([])
lst = QListWidget()
lst.addItems(["A", "B", "C"])
item = lst.takeItem(0)
print(item.text(), lst.count())
lst.insertItem(lst.count(), item)
lst.setCurrentItem(item)
print([lst.item(i).text() for i in range(lst.count())], lst.currentRow())
Натиҷа:
A 2
['B', 'C', 'A'] 2
Баъди баровардан ду элемент монд. Гузоштан ба lst.count() A-ро ба охир илова кард ва setCurrentItem(item) маҳз ҳамин объектро ҷорӣ намуд. Мавқеи A аз 0 ба 2 гузашт. Баъди кӯчондан наметавон интизор шуд, ки индекси кӯҳна ба ҳамон объект ишора мекунад.
Пеш аз хориҷ ё кӯчондан мавҷудияти сатри ҷорӣ ва дурустии мавқеи навро санҷед. Сатри аввал, сатри охирин ва рӯйхати якэлементиро алоҳида баррасӣ кунед. clear() ҳамаи элементҳоро нест мекунад; барои натиҷаҳои муваққатии ҷустуҷӯ ин амали аз ҳад зиёд аст.
5. Ҷустуҷӯи элементҳо аз рӯи матн
findItems қоидаҳои тайёри мувофиқатро пешниҳод мекунад. Парчами Qt.MatchFlag.MatchExactly мувофиқати дақиқро муайян мекунад. Натиҷа рӯйхати объектҳост, зеро матни яксон метавонад чанд бор такрор шавад. row(item) индекси ҷории объекти ёфтшударо медиҳад.
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QListWidget
app = QApplication.instance() or QApplication([])
lst = QListWidget()
lst.addItems(["Qt", "Python", "Qt"])
matches = lst.findItems("Qt", Qt.MatchFlag.MatchExactly)
print(len(matches), [lst.row(item) for item in matches])
Натиҷа:
2 [0, 2]
Дар дохил чӣ рӯй медиҳад
QListWidget элементҳоро нигоҳ дошта, намоиши онҳоро идора мекунад. Ҳангоми ворид кардани сатр рӯйхат тартиб ва экранро нав мекунад. Пинҳонкунӣ танҳо намоишро иваз мекунад, вале баровардан худи маҷмӯи элементҳоро тағйир медиҳад. Инҳо се амали гуногунанд, ҳатто агар корбар натиҷаи монанд бинад.
Хатоҳои маъмул ва ислоҳи онҳо
lst.currentItem().text()бе санҷиш: вақте интихоб нест, онNoneаст ва AttributeError пайдо мешавад. Аввал объект ёcurrentRow() >= 0-ро санҷед.lst.item(lst.count()): чунин мавқеъ нест ваNoneбармегардад. Индекси дуруст гиред; барои сатри охир аввал холӣ набудани рӯйхатро санҷед.lst.takeItem(row)ҳангоми филтркунӣ: сатр аз додаҳои рӯйхат мебарояд ва баъди тоза кардани ҷустуҷӯ барнамегардад. Барои пинҳонкунии муваққатӣsetHiddenлозим аст.- Танҳо
item.setHidden(True)барои номувофиқатҳо: баъди тағйири дархост сатрҳои пешина пинҳон мемонанд. Барои ҳар элемент мувофиқи натиҷаи санҷиш ҳамTrueва ҳамFalse-ро аз нав таъйин кунед. - Баъди кӯчондан нигоҳ доштани индекси ҷории кӯҳна: амали баъдӣ ба сатри дигар таъсир мекунад. Элементи ҷориро аз рӯи объект ё мавқеи нав барқарор кунед.
Ёддошти кӯтоҳ
| Амал | Метод |
|---|---|
| Илова / ворид кардан | addItem, addItems / insertItem |
| Шумора / элемент аз рӯи индекс | count() / item(i) |
| Матни элемент | item.text() |
| Сатри ҷорӣ / объект | currentRow() / currentItem() |
| Набудани элементи ҷорӣ | -1 / None |
| Пинҳон ва баргардондан | setHidden(True/False) |
| Баровардан бо нигоҳдории объект | takeItem(row) |
| Ҷорӣ кардани объект / ёфтани мавқеи он | setCurrentItem(item) / row(item) |