QScrollArea не прокручивается

Я пытаюсь поместить QtableWidget в QScrollArea (только один виджет), чтобы иметь возможность прокручивать его по вертикали и горизонтали (у меня есть причины не использовать полосы прокрутки в Qtablewidget). Однако полоса прокрутки не отображается, хотя tableWidget не помещается в окне, поэтому я установил QtCore.Qt.ScrollBarAlwaysOn, и теперь они есть, но они серые, и я все еще не могу прокручивать.

Вот мой код:

class Table(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Table, self).__init__(parent)
        layout = QtGui.QGridLayout() 
        tableWidget = QtGui.QTableWidget()
        #.... set up and populate tableWidget here 1000rows-10col ....
        myScrollArea = QtGui.QScrollArea()
        myScrollArea.setWidgetResizable(True)
        myScrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        myScrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        myScrollArea.setWidget(tableWidget)
        layout.addWidget(myScrollArea)
        self.setLayout(layout)
        self.setMinimumSize(1000, 700)

Я новичок в PyQt и не очень разбираюсь в макетах и ​​контейнерах, поэтому не могу понять, что делаю не так. Пожалуйста, укажите мне правильное направление, помощь будет принята с благодарностью.


person Aleksandar    schedule 28.06.2013    source источник


Ответы (2)


QtScrollBar по умолчанию имеет горизонтальную и вертикальную полосу прокрутки. tablewidget по умолчанию имеет горизонтальную и вертикальную полосу прокрутки. так что я ушел. просто используя событие изменения размера, я изменил ширину и высоту tablewidget.

class MainWin(QtGui.QDialog):
def __init__(self,parent=None):
    QtGui.QDialog.__init__(self,parent)

    self.table =QtGui.QTableWidget(100,4)
    self.table.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
    self.table.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)

    lay = QtGui.QGridLayout()
    self.sc = QtGui.QScrollArea()
    self.sc.setWidget(self.table)
    lay.addWidget(self.sc,0,0)
    self.setLayout(lay)


def resizeEvent(self,event):
    self.table.resize(self.sc.width(),self.sc.height())




def main():
    app=QtGui.QApplication(sys.argv)
    win=MainWin()
    win.show()
    sys.exit(app.exec_())

main()
person raton    schedule 29.06.2013
comment
Спасибо за ваш ответ. Я также сделал ScrollBarAlwaysOff для стола, как вы. Когда я запускаю ваш код, я вижу полосы прокрутки QScrollArea и 5 строк, но могу прокрутить вниз только для того, чтобы увидеть еще одну строку. Я использую PyQt4 и Python 2.6. Можете ли вы прокрутить свой код до всех 100 строк? пожалуйста, помогите мне, это вызывает у меня головную боль на некоторое время - person Aleksandar; 01.07.2013
comment
О, я забыл упомянуть, что мне нужно использовать self.table.resizeRowsToContents() и self.table.resizeColumnsToContents() после заполнения таблицы - person Aleksandar; 01.07.2013

Я наконец понял: я использовал resizeColumnsToContents() и resizeRowsToContents(), чтобы настроить столбцы / строки таблицы под данные - текст, но это не делает то же самое с самой таблицей - высота и ширина таблицы остаются прежними. Итак, чтобы сделать таблицу размерной по строкам и столбцам, я использовал следующее:

self.table.resizeRowsToContents()
self.table.resizeColumnsToContents()   
self.table.setFixedSize(self.table.horizontalHeader().length(), self.table.verticalHeader().length())

и теперь я могу прокручивать с помощью полос прокрутки QScrollArea всю таблицу.

person Aleksandar    schedule 01.07.2013