Барномаи қайдҳо
Барои чӣ ҳама чизро ба як барнома ҷамъ мекунем
Тугма, рӯйхат ва муҳаррире, ки алоҳида кор мекунанд, ҳанӯз барномаи қулай нестанд. Корбар интизор аст, ки интихоби қайд матнашро нишон диҳад, таҳрир додаҳоро нав кунад ва сабт маҳз он чизеро нависад, ки дар муҳаррир дида мешавад. Лоиҳаи ниҳоӣ ин амалҳоро ба як низом мепайвандад.
1. Рӯйхат ва муҳаррир паҳлуи ҳам
QSplitter контейнер бо марзи кашидашаванда байни виджетҳои фарзанд аст. Бо самти уфуқӣ рӯйхат ва муҳаррир дар чапу рост ҷой мегиранд. Бар хилофи қатори одии layout, корбар метавонад паҳнои нисбии онҳоро бо муш тағйир диҳад.
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QSplitter, QListWidget, QPlainTextEdit
app = QApplication.instance() or QApplication([])
splitter = QSplitter(Qt.Orientation.Horizontal)
lst = QListWidget()
editor = QPlainTextEdit()
splitter.addWidget(lst)
splitter.addWidget(editor)
splitter.setSizes([150, 450])
print(splitter.count(), splitter.widget(0) is lst, splitter.widget(1) is editor)
Натиҷа:
2 True True
Контейнер ду виджетро бо тартиби илова нигоҳ медорад. setSizes тақсимоти дилхоҳи ҷойро медиҳад; андозаҳои воқеӣ аз равзана ва андозаҳои камтарини виджетҳо вобастаанд.
2. Додаҳо ва навиштаҳо вазифаҳои гуногун доранд
Додаҳои қайдҳо матнҳои пурра дар рӯйхати одии Python мебошанд. Навишта тасвири кӯтоҳ барои паймоиш аст. Навиштаи кӯтоҳшуда набояд матни пурраро дар нигоҳдорӣ иваз кунад. Бубинем, ки тағйири виджет ба рӯйхати ҷудогонаи додаҳо чӣ таъсир дорад.
from PySide6.QtWidgets import QApplication, QListWidget
app = QApplication.instance() or QApplication([])
notes = ["Масир\nАвтобус", "Нақшаҳо\nКитобҳо"]
lst = QListWidget()
lst.addItems(["Масир", "Нақшаҳо"])
lst.item(0).setText("Навиштаи кӯтоҳ")
print(lst.item(0).text())
print(notes[0].replace("\n", " | "))
Натиҷа:
Навиштаи кӯтоҳ
Масир | Автобус
Навиштаи лоиҳа аз сатри аввалини ғайрихолӣ гирифта шуда, дарозиаш маҳдуд аст. Қайди холӣ навиштаи пешфарз мехоҳад. Ҳуҷҷати пурра дар додаҳо мемонад; қоидаҳои дақиқ дар масъала муайян шудаанд.
3. Бор кардани матн набояд таҳрир шуморида шавад
Ҳангоми интихоби сатр барнома setPlainText-ро даъват мекунад. Муҳаррир ҳатто ҳангоми гузоштани матн аз код textChanged мебарорад. Агар коркардкунанда ҳар огоҳиро бечунучаро таҳрири корбар шуморад, иваз кардани қайд метавонад сабти зиёдатӣ оғоз кунад ё сабти нодурустро тағйир диҳад.
QSignalBlocker имкон медиҳад ҳуҷҷат бе оғози коркардкунандаи таҳрир нишон дода шавад. Дар мисол рӯйхати writes чунин огоҳиҳоро сабт мекунад; он анбори қайдҳо нест.
from PySide6.QtCore import QSignalBlocker
from PySide6.QtWidgets import QApplication, QListWidget, QPlainTextEdit
app = QApplication.instance() or QApplication([])
notes = ["A\nB", "C\nD"]
lst = QListWidget()
lst.addItems(["A", "C"])
editor = QPlainTextEdit()
writes = []
editor.textChanged.connect(lambda: writes.append(editor.toPlainText()))
def on_select(row):
with QSignalBlocker(editor):
editor.setPlainText(notes[row] if row >= 0 else "")
lst.currentRowChanged.connect(on_select)
lst.setCurrentRow(1)
print(editor.toPlainText().replace("\n", " | "), writes)
editor.setPlainText("E")
print(writes)
Натиҷа:
C | D []
['E']
Баъди интихоби сатри дуюм муҳаррир ҳуҷҷати онро нишон медиҳад, вале рӯйхати огоҳиҳо холӣ аст. Тағйироти навбатӣ берун аз бастан аллакай сабт мешавад. Коркардкунандагони интихоб ва таҳрир вазифаҳои гуногун доранд: аввалӣ додаҳоро мехонад ва дуюм тағйироти корбарро менависад.
4. Навкунии мувофиқ
Инвариант шартест, ки барнома байни амалҳои корбар нигоҳ медорад. Дар ин ҷо ду шарт фоида дорад: шумораи элементҳои виджет ба шумораи қайдҳо баробар аст ва элементи дорои индекс ҳуҷҷати ҳамон индексро ифода мекунад. Ҳангоми тағйири муҳтаво ҳам додаҳо ва ҳам навиштаи мувофиқ нав мешаванд.
from PySide6.QtWidgets import QApplication, QListWidget
app = QApplication.instance() or QApplication([])
notes = ["Масир", "Нақшаҳо"]
lst = QListWidget()
lst.addItems(notes)
lst.setCurrentRow(1)
row = lst.currentRow()
if row >= 0:
notes[row] = "Нақшаҳои пагоҳ"
lst.item(row).setText(notes[row])
print(notes[row], lst.currentItem().text())
print(len(notes) == lst.count())
Натиҷа:
Нақшаҳои пагоҳ Нақшаҳои пагоҳ
True
Нест кардан ва сохтан якбора чанд қисми ҳолатро иваз мекунанд. Баъди нест кардан ҳамсояи мувофиқро интихоб кунед; агар ҳуҷҷат намонад, муҳаррир чизе барои таҳрир надорад. Ҳангоми сохтан мавқеи сабти нав, ном, интихоб ва дастрасии муҳаррирро мувофиқ кардан лозим аст. Ин қоидаҳоро ҳамчун як амал иҷро кунед, на тағйироти мустақилу тасодуфии виджетҳо.
Дар дохил чӣ рӯй медиҳад
Даври одии кор чунин аст: currentRowChanged → хондани ҳуҷҷати интихобшуда → навкунии ороми муҳаррир. Баъд таҳрири корбар → хондани toPlainText() → навкунии додаҳо → навкунии навишта. Фармони сабт додаҳои пурраро мегирад, на сарлавҳаҳои кӯтоҳи рӯйхатро.
Тағйири рӯйхат метавонад ҳанӯз пеш аз анҷоми метод сигнали интихоб барорад. Бовар кунед, ки коркардкунанда додаҳо ва индексҳои мувофиқро истифода мебарад. Агар огоҳиҳо муваққатан баста шаванд, баъди амал ҳолати ниҳоиро ошкоро нишон диҳед.
Хатоҳои маъмул ва ислоҳи онҳо
- Сабт кардани
lst.item(i).text()ба ҷойи ҳуҷҷати пурра: ба файл танҳо навиштаҳо мераванд. Матнҳои пурраро аз нигоҳдории додаҳо гиред. - Хондани
notes[-1], вақтеcurrentRow()адади -1 медиҳад: Python ҳуҷҷати охиринро мегирад, гарчанде интихоб нест. Аввал индексро санҷед ва набудани сабти ҷориро алоҳида коркард кунед. - Ҳар
setPlainText-ро таҳрири корбар шуморидан: иваз кардани ҳуҷҷат тағйироти зиёдатӣ меорад. Боркунӣ ва таҳрирро ҷудо кунед ва ҳангоми боркунӣ сигналро муваққатан бандед. - Тағйири тартиб танҳо дар виджет: навиштаи интихобшуда дигар ба матн мувофиқ нест. Мувофиқати сабтҳоро дар додаҳо ва рӯйхат яксон нигоҳ доред.
- Ғайрифаъол кардани муҳаррири холӣ ва фаромӯш кардани фаъолсозӣ баъди сохтан: сабти нав ҳаст, вале навиштан намешавад. Дастрасии муҳаррирро қисми ҳолати ниҳоии амал ҳисоб кунед.
Ёддошти кӯтоҳ
| Қисми барнома | Вазифа |
|---|---|
| Рӯйхати Python | матнҳои пурраи ҳуҷҷатҳо |
| QListWidget | навиштаҳо ва сатри ҷорӣ |
| QPlainTextEdit | намоиш ва таҳрири матни ҷорӣ |
| QSplitter | ҷой барои рӯйхат ва муҳаррир |
| Коркардкунандаи интихоб | хондан ва нишон додани додаҳо бе таҳрири бардурӯғ |
| Коркардкунандаи таҳрир | нав кардани додаҳо ва навишта |
| Сохтан / нест кардан | мувофиқ кардани додаҳо, рӯйхат, интихоб ва дастрасӣ |
| Сабт | навиштани додаҳои пурра ва баъд нав кардани нусхаи сабтшуда |