2017-03-17 4 views
1

Ich habe online gesucht, konnte aber dieses Problem nicht lösen. Ich habe drei (obwohl dies eine beliebige Anzahl sein kann) QTableView-Objekte, die alle länger sind als die Größe, die sie anzeigen (sie sind auch gleich lang). Für alle 3 habe ich eine Bildlaufleiste automatisch generiert. Ich möchte auf eines dieser Objekte klicken, um die anderen QTableView-Objekte um denselben Betrag zu verschieben.PyQt - Verknüpfen mehrerer QTableView-Objekte über Bildlaufleisten

Leider konnte ich online keine Lösung dafür finden. Das nächste, was ich bekam, war dies (https://forum.qt.io/topic/25139/solved-synchronizing-two-qtableview-s-scrollbars/3), obwohl dies meiner Situation nicht geholfen hat.

Jede Hilfe zu dieser Frage wäre sehr willkommen! Vielen Dank!

Antwort

1

Hier ist ein MCVE von drei QTableView Widgets mit ihren vertikalen Bildlaufleisten verknüpft. Wir verbinden die move_other_scrollbars() benutzerdefinierte Methode mit dem QAbstractSlider.valueChanged Signal jeder Bildlaufleiste, mit Lambda, um die entsprechenden Informationen zu übergeben: die idx der Bildlaufleisten und die scrollbar, die vom Benutzer verschoben wurde). Im Gegenzug findet move_other_scrollbars() alle anderen Bildlaufleisten und aktualisiert ihre Position mit 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

Vielen Dank! –

Verwandte Themen