2017-03-17 21 views
1

私はオンラインで検索しましたが、この問題を解決できませんでした。私は3つの(これは任意の数にすることができますが)QTableViewオブジェクトは、それらが表示しているサイズよりも長く(同じ長さでもあります)持っています。 3つすべて私はスクロールバーが自動的に生成されています。これらのいずれかをクリックして、他のQTableViewオブジェクトを同じ量だけ移動したいと思います。PyQt - スクロールバーを使用して複数のQTableViewオブジェクトをリンクする

残念ながら、私はこのオンラインの解決策を見つけることができませんでした。私が得た最も近いものはこれ(https://forum.qt.io/topic/25139/solved-synchronizing-two-qtableview-s-scrollbars/3)でしたが、これは私の状況を助けませんでした。

この質問に関するお手伝いをさせていただきます。ありがとう!

答えて

1

ここには3つのQTableViewウィジェットと、その垂直スクロールバーがリンクされたMCVEがあります。 move_other_scrollbars()カスタムメソッドを各スクロールバーのQAbstractSlider.valueChanged信号に接続します。ラムダを使用してスクロールバーのidxとユーザーによって移動されたという適切な情報を渡します。次に、move_other_scrollbars()は他のすべてのスクロールバーを見つけてQAbstractSlider.setValue(idx)で位置を更新します。

from PyQt5.QtCore import (Qt, QStringListModel) 
from PyQt5.QtWidgets import (QApplication, QWidget, QTableView, QHBoxLayout) 


class MainWindow(QWidget): 

    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.table_view_1 = QTableView() 
     self.table_view_2 = QTableView() 
     self.table_view_3 = QTableView() 
     items = ['apples', 'bananas', 'cookies', 'drinks', 'eggs', 'flour', 'gatorade'] 
     items_2 = ['alligator', 'bear', 'cat', 'deer', 'elephant', 'flamingo', 'goose'] 
     items_3 = ['Arsenic', 'Boron', 'Carbon', 'Dysprosium', 'Europium', 'Flourine', 'Gold'] 
     self.model = QStringListModel(items) 
     self.model_2 = QStringListModel(items_2) 
     self.model_3 = QStringListModel(items_3) 

     self.table_view_1.setModel(self.model) 
     self.table_view_2.setModel(self.model) 
     self.table_view_3.setModel(self.model_3) 
     self.layout = QHBoxLayout() 

     self.list_of_tables = [self.table_view_1,self.table_view_2, self.table_view_3] 

     def move_other_scrollbars(idx,bar): 
      scrollbars = {tbl.verticalScrollBar() for tbl in self.list_of_tables} 
      scrollbars.remove(bar) 
      for bar in scrollbars: 
       bar.setValue(idx) 

     for tbl in self.list_of_tables: 
      scrollbar = tbl.verticalScrollBar() 
      scrollbar.valueChanged.connect(lambda idx,bar=scrollbar: move_other_scrollbars(idx, bar)) 
      self.layout.addWidget(tbl) 

     self.setLayout(self.layout) 

if __name__ == '__main__': 
    import sys 

    app = QApplication(sys.argv) 
    window = MainWindow() 
    window.show() 
    sys.exit(app.exec_()) 
+0

ありがとうございました! –

関連する問題