2017-10-19 155 views
0

我正在实现一个应用程序,其中小部件可以展开/收缩,因此另一个小部件必须收缩/展开。 (或者这个小部件可以显示在这个小部件上,这没关系,我接受这两个实现)。它可以看起来像这样: enter image description here小部件的相互调整大小

这里是我的代码的一部分:

class AppView: 
    def __init__(self): 
     self._mainWindow = QDialog(None) 
     self._schedule = ScheduleView(self._mainWindow) 
     self._schedule.setMinimumWidth(25) 
     self._schedule.setMaximumWidth(250) 
     self._tutorial = TutorialView(self._mainWindow) 
     self._schedule.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) 
     self._tutorial.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) 
     layout = QHBoxLayout() 
     layout.addWidget(self._schedule) 
     layout.addWidget(self._tutorial) 
     layout.setSpacing(0) 
     layout.setContentsMargins(0, 0, 0, 1) 
     self._mainWindow.setLayout(layout) 

class TutorialView(QWidget): 
    def __init__(self, parent=None): 
     QWidget.__init__(self, parent=parent) 
     self._presenter = TutorialPresenter(self) 
     self.reqReprSections.connect(self.setModel) 
     self.reqReprTopics.connect(self.setModel) 
     self._widget = QQuickWidget(self) 
     self._widget.rootContext().setContextProperty('tutorialView', self) 
     self._widget.setSource(QUrl('modules/manual/manualForm/TutorialForm.qml')) 

class ScheduleView(QWidget): 
    def __init__(self, parent=None): 
     QWidget.__init__(self, parent=parent) 
     self._presenter = SchedulePresenter(self) 
     self._widget = QQuickWidget(self) 
     self._widget.setResizeMode(QQuickWidget.SizeViewToRootObject) 
     self._widget.rootContext().setContextProperty('scheduleView', self) 
     self._widget.rootContext().setContextProperty('groupsModel', self) 
     self._widget.setSource(QUrl('modules/schedule/scheduleForm/ScheduleForm.qml')) 

我怎么可以在代码中做这样的调整大小?

+0

什么是你的问题? – Darklighter

+1

您可以使用[了QSplitter(http://doc.qt.io/qt-5/qsplitter.html#details),或者类似的东西[这](https://stackoverflow.com/a/37119983/2747962 )。 – Darklighter

回答

2

要获得这种行为,你可以通过在侧部件的中间嵌入一个旋转按钮使用QHBoxLayout,负责。您必须更改左侧窗口小部件的大小策略,以使其不扩展。

要实现旋转的按钮,你必须覆盖的paintEvent方法,除了修改大小策略,使其垂直和水平不扩大。

class ShrinkExpandButton(QPushButton): 
    def __init__(self, *args, **kwargs): 
     QPushButton.__init__(self, *args, **kwargs) 
     self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding) 
     self.setFixedWidth(2*self.fontMetrics().height()) 

    def paintEvent(self, event): 
     painter = QStylePainter(self) 
     painter.rotate(-90) 
     painter.translate(-self.height(), 0) 
     option = QStyleOptionButton() 
     self.initStyleOption(option) 
     size = option.rect.size() 
     size.transpose() 
     option.rect.setSize(size) 
     painter.drawControl(QStyle.CE_PushButton, option) 


class ShrinkExpandWidget(QWidget): 
    def __init__(self, leftWidget, rightWiget, text, parent=None): 
     QWidget.__init__(self, parent) 
     button = ShrinkExpandButton(text, self) 

     self.setLayout(QHBoxLayout()) 
     self.layout().setSpacing(0) 
     self.layout().addWidget(leftWidget) 
     self.layout().addWidget(button) 
     self.layout().addWidget(rightWiget) 
     leftWidget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding) 
     button.clicked.connect(lambda: leftWidget.setVisible(not leftWidget.isVisible())) 

例子:

if __name__ == '__main__': 
    import sys 
    app = QApplication(sys.argv) 
    listWidget = QListWidget() 
    for i in range(20): 
     listWidget.addItem("{}".format(i)) 

    tableWidget = QTableWidget() 
    tableWidget.setColumnCount(10) 
    tableWidget.setRowCount(20) 
    for i in range(tableWidget.rowCount()): 
     for j in range(tableWidget.columnCount()): 
      tableWidget.setItem(i, j, QTableWidgetItem("({}, {})".format(i, j))) 
    listWidget.setFixedWidth(240) 
    w = ShrinkExpandWidget(listWidget, tableWidget, "Shrink - Expand") 
    w.resize(720, 480) 
    w.show() 
    sys.exit(app.exec_()) 

输出:

enter image description here