2017-04-24 213 views
0

使用Python和PyQt5我编程遵循GUI。
现在我想自定义程序,以便能够通过单击右边的表格边框(浅蓝线)并移动鼠标(请参见图中的箭头)来更改左边的宽度。在改变表格宽度的同时,右侧也应该改变。 我希望我的描述很清楚。在运行时调整QTableWidget/QHBoxLayout的大小

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' 

我怎样才能解决这个错误,以及如何改变代码工作。

+0

你可以更好的解释,请 – eyllanesc

+0

的可能的复制[制取2 QVBoxLayout QHBoxLayout,负责内可调整大小(http://stackoverflow.com/questions/41840760/make-two-qvboxlayout-resizable -within-a-qhboxlayout) – rbaleksandar

+0

@rbaleksander QSplitter听起来不错,但我不知道它是如何工作的。我会发布我的结果。 – mepi0011

回答

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_()) 

enter image description here

+0

谢谢!随着一些小的变化,我可以解决我的问题! – mepi0011

相关问题