2017-10-19 312 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

相關問題