2015-04-11 5 views
0

Я пытаюсь использовать несколько горизонтальных sub QScrollAreas с текстом и одним вертикальным контейнером QScrollArea. Идея состоит в том, что текстовая область в горизонтальной подстроке QScrollAreas всегда будет иметь эквивалентную вертикальную высоту, и я хотел бы иметь одну вертикальную QScrollArea для управления данными внутри них.PyQt QScrollArea в QScrollArea

В приведенном ниже коде показано, что горизонтальная подпрограмма QScrollAreas работает, но вертикальная QScrollArea не обнаруживает, что строка, редактируемая внутри виджета внутри нее, не соответствует вертикали. Если изменить

scroll.setWidgetResizable(True) 

для вертикального QScrollArea в False, то вертикальная QScrollArea обнаруживает виджет внутри не подходит, но я хочу, чтобы иметь возможность прокручивать все lineEdits вверх и вниз, не родительский виджет. Также я хотел бы, чтобы все полосы прокрутки всегда были видны. Это возможно?

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class Widget(QWidget): 
    def __init__(self, parent= None): 
     super(Widget, self).__init__() 
     self.setGeometry(100, 100, 400, 400) 
     baseWidget = QWidget() 
     hBox = QHBoxLayout() 
     hBox.addWidget(self.getWidget()) 
     hBox.addWidget(self.getWidget()) 
     baseWidget.setLayout(hBox) 
     scroll = QScrollArea() 
     scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) 
     scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 
     #when set to False all scrolls are not visible and can only scroll parent widget not the data areas 
     scroll.setWidgetResizable(True) 
     scroll.setWidget(baseWidget) 
     vBox = QHBoxLayout() 
     vBox.addWidget(scroll) 
     self.setLayout(vBox) 

    def getWidget(self):  
     widget = QWidget() 
     layout = QVBoxLayout() 
     for i in range(20): 
      lineEdit = QLineEdit("row: "+str(i)+" data: "+str(list(range(10)))) 
      lineEdit.setMinimumWidth(250) 
      layout.addWidget(lineEdit) 
     widget.setLayout(layout) 
     scroll = QScrollArea() 
     scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 
     scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn) 
     scroll.setWidgetResizable(False) 
     scroll.setWidget(widget) 
     return scroll 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    dialog = Widget() 
    dialog.show() 

ответ

0

Ответ можно найти здесь:

PyQt4 : is there any signal related to scrollbar?

Просто необходимо синхронизировать вертикальные полосы прокрутки и скрыть все, кроме одного:

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class Widget(QWidget): 

    def __init__(self, parent= None): 
     super(Widget, self).__init__() 
     self.setGeometry(100, 100, 200, 200) 
     baseWidget = QWidget() 
     hBox = QHBoxLayout() 
     lscrollArea = self.getWidget(False) 
     rScrollArea = self.getWidget(True) 
     rScrollArea.verticalScrollBar().valueChanged.connect(
     lscrollArea.verticalScrollBar().setValue) 
     hBox.addWidget(lscrollArea) 
     hBox.addWidget(rScrollArea) 
     baseWidget.setLayout(hBox) 
     vBox = QHBoxLayout() 
     vBox.addWidget(baseWidget) 
     self.setLayout(vBox) 

    def getWidget(self, vScrollOn):  
     widget = QWidget() 
     layout = QVBoxLayout() 
     for i in range(20): 
      lineEdit = QLineEdit("row: "+str(i)+" data: "+str(list(range(10)))) 
      lineEdit.setMinimumWidth(250) 
      layout.addWidget(lineEdit) 
     widget.setLayout(layout) 
     scroll = QScrollArea() 
     if vScrollOn: 
      scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) 
     else: 
      scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 
     scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn) 
     scroll.setWidgetResizable(False) 
     scroll.setWidget(widget) 
     return scroll 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    dialog = Widget() 
    dialog.show() 
    app.exec_() 
Смежные вопросы