2017-03-17 21 views
1

我已經在網上搜索,但一直無法找到解決這個問題。我有三個(儘管這可以是任意數量)QTableView對象,它們的長度都大於它們顯示的尺寸(它們也是等長的)。對於所有3我有一個滾動條自動生成。我想單擊其中的任何一個以相同的量移動其他QTableView對象。PyQt - 通過滾動條鏈接多個QTableView對象

不幸的是我無法找到這個在線的解決方案。我得到的最接近的是(https://forum.qt.io/topic/25139/solved-synchronizing-two-qtableview-s-scrollbars/3),雖然這並沒有幫助我的情況。

對這個問題的任何幫助將不勝感激!謝謝!

回答

1

下面是三個QTableView小部件的MCVE鏈接的垂直滾動條。我們將move_other_scrollbars()自定義方法連接到每個滾動條的QAbstractSlider.valueChanged信號,並使用lambdas傳遞適當的信息:滾動條的idx和用戶已移動的scrollbar)。然後,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

非常感謝! –