【问题标题】:resize QTableWidget / QHBoxLayout at runtime在运行时调整 QTableWidget / QHBoxLayout
【发布时间】:2017-09-21 09:54:48
【问题描述】:

我使用 Python 和 PyQt5 编程遵循 GUI。
现在我想自定义程序,这样我就可以通过单击右表边框(浅蓝色线)并移动鼠标(见图中的箭头)来更改左表宽度。在改变表格宽度的同时,右侧也应该改变。 我希望我的描述清楚。

图形界面输出:

GUI布局部分代码:

# table for writeOutput
    self.tableWidget = QTableWidget(0, 2)
    self.tableWidget.verticalHeader().setVisible(False);
    self.tableWidget.setMinimumHeight(170)
    self.tableWidget.setMinimumWidth(600)

    # generate chart
    self.main_widget = QWidget(self)
    self.chart = QtBarChart(self.main_widget)

    # Layout for input elements
    inputLayout = QHBoxLayout()
    inputLayout.addWidget(self.typeCBox)
    inputLayout.addWidget(self.yearSpinBox)
    inputLayout.addWidget(self.button)
    inputLayout.addStretch(1)

    # right inner layout for output elements e.g chart
    innerOutLayout = QVBoxLayout()
    innerOutLayout.addWidget(self.chart)
    innerOutLayout.addWidget(self.outEdit)

    # outer layout for output elements e.g. table
    outLayout = QHBoxLayout()
    outLayout.addWidget(self.tableWidget)
    outLayout.addLayout(innerOutLayout)

    # top layout who groups all elements together
    topLevelLayout = QVBoxLayout()
    topLevelLayout.addLayout(inputLayout)
    topLevelLayout.addLayout(outLayout)

我需要对哪些功能或代码进行更改才能实现我的目标?
--> QSplitter 是一个很好的提示

当我尝试实现 QSplitter 并按如下方式更改程序时,我收到错误消息。

# Layout for input elements
inputLayout = QHBoxLayout()
inputLayout.addWidget(self.typeCBox)
inputLayout.addWidget(self.yearSpinBox)
inputLayout.addWidget(self.button)
inputLayout.addStretch(1)

# right inner layout for output elements e.g chart
innerOutLayout = QVBoxLayout()
innerOutLayout.addWidget(self.chart)
innerOutLayout.addWidget(self.outEdit)

# create Splitter between Table and innerOutLayout() --> (Chart and outEdit)
tableSplitter = QSplitter(Qt.Horizontal)
tableSplitter.addWidget(self.tableWidget)
tableSplitter.addLayout(innerOutWidget)

# outer layout for output elements e.g. table
outLayout = QHBoxLayout()
outLayout.addWidget(self.tableWidget)
outLayout.addWidget(tableSplitter)

# top layout who groups all elements together
topLevelLayout = QVBoxLayout()
topLevelLayout.addLayout(inputLayout)
topLevelLayout.addLayout(outLayout)

当我运行程序时出现以下错误:

tableSplitter.addLayout(innerOutWidget)
AttributeError: 'QSplitter' object has no attribute 'addLayout'

我该如何解决这个错误以及如何更改代码才能工作。

【问题讨论】:

标签: python pyqt pyqt5 qtablewidget qlayout


【解决方案1】:

解决方案是使用QSplitter,这些类似于QLayout,目的是控制小部件的大小。

下面的例子展示了它的用法。

from PyQt5 import QtCore, QtGui, QtWidgets

class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent=parent)

        self.verticalLayout = QtWidgets.QVBoxLayout(self)

        self.splitter = QtWidgets.QSplitter(self)
        self.splitter.setOrientation(QtCore.Qt.Horizontal)

        self.createTable(self.splitter, 2, 2)
        self.splitter1 = QtWidgets.QSplitter(self.splitter)
        self.splitter1.setOrientation(QtCore.Qt.Vertical)

        self.createTable(self.splitter1, 3, 3)
        self.createTable(self.splitter1, 4, 4)

        self.verticalLayout.addWidget(self.splitter)



    def createTable(self, parent, nrows, ncols):
        tableWidget = QtWidgets.QTableWidget(parent)

        tableWidget.setRowCount(nrows)
        tableWidget.setColumnCount(ncols)

        for i in range(tableWidget.rowCount()):
            for j in range(tableWidget.columnCount()):
                item = QtWidgets.QTableWidgetItem(f"{i}{j}")
                tableWidget.setItem(i, j, item)

        return tableWidget


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

【讨论】:

  • 谢谢!通过一些小的改变,我可以解决我的问题!
猜你喜欢
  • 2013-08-20
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多