--- Title: pythonでfoobarのalternativeを作る 24 Author: yamasyuh68 Web: https://mimemo.io/m/D1V7LGw5ExlYPNj --- 190605 # player 作り込み - 飲み会だったのでほとんど手をつけてない - メニューバーは最近使わないので削除してみた 下のステイタスもいらないかな? ツールバーをメニューで分岐できたら完璧なんだけどな ## 行の選択~次の曲の自動演奏のため - 出来た(・∀・)ノ index = treeview.model().index(3, 0) treeview.setCurrentIndex (index) 3行目(実際は4行目)を選択表示します ビューに対してインデクスを指定してやれば良いだけだが、インデクス自体はビューではなくてモデルの属性です 考えたらそうだよなあとは思いますが、ビューとデータが分離してるのでわかりやすいというかわかりづらいというか微妙 指定行が隠れている場合は自動的に見えるようにしてくれます foobarは現在演奏している曲がわからなくなるときがあるのでこの挙動の方が良いと思う - 演奏中にリストをいじった場合、インデクスが変わる可能性がある 変わるのは演奏曲の上のリストをいじった場合 何らかのメッセージに対応するか? 曲をリストから検索する方法はダメ 二重にリスト化されてる可能性もあるから リストにカラムを追加して演奏中のフラグを立てておけば良いかな そのフラグの下の曲を次に演奏すればいい 演奏中の曲を削除した場合はどうする? フラグが立ってたら削除できないようにするか、削除後の直上に仮のフラグを立てるか - フラグ対応なら行を選択する必要もなくなるな( ̄― ̄?) ---- 190606 - リストのルートの線はこれで消えた QTreeView.setRootIsDecorated (0) - 特定行だけカラムを無視して一列にする これでイケた、簡単だった (・∀・)ノ >index=TreeView.selectedIndexes ()[0] TreeView.setFirstColumnSpanned (index.row() ,index.parent() ,1) これは行を選択してからその行を伸ばすコード 勿論特定の行でも良い `selectedIndexes`はリストで`QModelIndex`が返ってくるので最初の要素を取り出した `setFirstColumnSpanned`は三番目のパラメータのparentってのがぴんとこない、rowだけで良いような気がするけど ### ドラッグ関係 - ドラッグの挙動をいじらずに、`rowsInserted`を使ってみた Qtwidgetはドラッグを許可しておけば、勝手にドロップしてくれる でも他のカラムも付け加えるなど少し変えたい その場合ドロップ処理をオーバーロードするのが筋だと思うけど、一旦ドロップさせてしまい、そのあとですぐにいじった方が簡単そうだ で、`rowsInserted`のメッセージを捕まえて操作してみた - いざやるとなると悩んだ QTreeView.rowsInserted (self, QModelIndex parent, int start, int end) となってるんだが、どう使うんだろう? 基本的にメッセージが飛んで来るものと思ってたが、 `rowsInserted.connect`としてもエラーになる リファレンスを見てもシグナルにはなってないからまあそうなんだな 考えたら挿入されるのはviewじゃなくてmodelの方だよなあと思い調べたら、`QAbstractItemModel`のシグナルにあった void rowsInserted (const QModelIndex&,int,int) 本体でこれにコネクトしたらメッセージが来ました - でも、ドロップの挿入のタイミングはこれでわかって、挿入の位置もわかるんだけど、動作は今ひとつ安定していない このシグナルのタイミングが早すぎるような??? **やはりdropを直接オーバーライドしなきゃダメなのかな??**