0 pythonでfoobarのalternativeを作る 21 190530

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=<pass>
        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
  • 途中です スレッドむずい( ̄― ̄?)
    今後の課題ですな
0

メモを他の人に見せる

このメモを見せたい人に、このURL(今開いているページのURLです)を教えてあげてください

コメント(0)

  • someone

  • someone