【问题标题】:QScrollArea won't scrollQScrollArea 不会滚动
【发布时间】:2013-06-28 13:29:45
【问题描述】:

我试图将 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 的初学者,我并不真正了解布局和容器,所以我无法弄清楚我做错了什么。请指出正确的方向,我们将不胜感激。

【问题讨论】:

    标签: pyqt4 qscrollarea


    【解决方案1】:

    QtScrollBar 默认有水平和垂直滚动条。 默认情况下,tablewidget 具有水平和垂直滚动条。所以我成功了。 仅使用 resize 事件我已经调整了 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()
    

    【讨论】:

    • 感谢您的回答。我也为像你这样的桌子做了ScrollBarAlwaysOff。当我运行您的代码时,我可以看到 QScrollArea 的滚动条和 5 行,但我只能向下滚动以查看更多行。我正在使用 PyQt4 和 Python 2.6。你能用你的代码向下滚动到所有 100 行吗?请帮帮我,这让我头痛了一段时间
    • 哦,忘了说填表后需要使用self.table.resizeRowsToContents()self.table.resizeColumnsToContents()
    【解决方案2】:

    我终于明白了: 我使用resizeColumnsToContents()resizeRowsToContents() 使表格的列/行适应数据 - 文本,但这对表格本身并没有做同样的事情 - 表格的高度和宽度保持不变。因此,为了使表格围绕行和列调整大小,我使用了这个:

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

    现在我可以使用 QScrollArea 的滚动条滚动整个表格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 2013-01-25
      • 2021-08-06
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多