--- Title: pythonでfoobarのalternativeを作る 21 190530 Author: yamasyuh68 Web: https://mimemo.io/m/qERa6lBbNklPb0v --- # DBViewer インクリメンタルサーチ - とりあえずインクリメンタルはスレッドにせずベタに実装してみる - sqlexecute(line) を再利用するためにmodelを戻り値にして、treeへのセットは戻ってからにしてみた ``` import sqlite3 from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QApplication,QWidget,QMainWindow from PyQt5.QtGui import QStandardItemModel , QStandardItem import ui class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.ui = ui.Ui_MainWindow() self.ui.setupUi(self) self.db= line='select artist ,album,title ,path from musics order by artist ,album,title' self.model=self.sqlexecute(line) self.ui.treeView.setModel(self.model) self.ui.actionBye.triggered.connect(self.actionbye) self.ui.actionchange.triggered.connect(self.actionchange) self.ui.actionclear.triggered.connect(self.actionclear) self.ui.actionreload.triggered.connect(self.actionreload) def actionchange(self): model2 = QStandardItemModel() for i in range(3): parent1 = QStandardItem('Family {}. Some long status text for sp'.format(i)) model2.appendRow(parent1) for j in range(3): child1 = QStandardItem('Child {}'.format(i*3+j)) child2 = QStandardItem('row: {}, col: {}'.format(i, j+1)) child3 = QStandardItem('row: {}, col: {}'.format(i, j+2)) parent1.appendRow([child1, child2, child3]) self.ui.treeView.setModel(model2) def actionreload(self): pass def sqlexecute( self, line ): conn = sqlite3.connect( self.db ) c = conn.cursor() item=['×','×'] tree=[None,None,None,None] model = QStandardItemModel() for l in c.execute(line) : # print(l) if item[0] != l[0] : # 1 a-artist tree[1] = QStandardItem(l[0]) model.appendRow(tree[1]) item[0]=l[0] if item[1] != l[1] : # 1 date album tree[2] = QStandardItem( l[1] ) tree[1].appendRow(tree[2]) item[1]=l[1] tree[3]=QStandardItem(l[2]) , QStandardItem(l[3]) tree[2].appendRow(tree[3]) c.close() conn.close() return model def actionbye(self): quit() def actionclear(self): self.model.clear() def search(self,e): item=self.ui.lineEdit.text() temp=self.ui.treeView.model() if item=='' : if temp == self.model : pass else: self.ui.treeView.setModel(self.model) del temp else : item="'%"+item+"%'" line='select artist ,album,title ,path from musics where \ artist like {} or path like {} or title like {}\ order by artist ,album,title'.format(item,item,item) self.ui.treeView.setModel(self.sqlexecute(line)) if temp != self.model: del temp def treeClicked(self,e): print(e.data()) print(e.siblingAtColumn(1).data()) if __name__ == '__main__': import sys app = QApplication(sys.argv) main_window = MainWindow() main_window.show() sys.exit(app.exec_()) ```    - 無事動作しまた。ちょっと遅いかもだが気にならない程度 (・∀・)ノ 動作が遅いのは一文字入力したときの、まあ当然だよな 一文字だけなら検索しないようにしたら随分違うと思うが、漢字は一文字でも検索させたいから悩ましいところ - 数字とアルファベットの一文字だけ検索しないようにしてみるか??正規表現が必要かな - 今後に向けてtreeのクリックで fullpathを取り出せるかやってみたら出来なかった┐('д')┌ やはりtreeのアイテムに付加データをセットすることは出来ないみたい で、titleをappendするときにフルパスをタプルにして渡してみた treeのクリックで`siblingAtColumn(1).data()`で無事取り出せました ここら辺は前に`treewidget`でやってたのと同じで良かった( ´∀`) ----- - スレッド使ったパターン ``` init self.count=0 self.th=[] item=gettext() if item=='' : m=getmodel() if m!=model1 : setmodel(1) del m else : if count : self.th[self.count-1].stop() del self.th[self.count-1] self.th[self.count] = makemodel() self.th[self.count].start(self) self.count += 1 class makemodel(threading.Thread): def __init__(self,parent) super(makemodel, self).__init__() self.par=par def run(): item=par.gettext() sql 関係 makemodei ``` - 途中です スレッドむずい( ̄― ̄?) 今後の課題ですな