PyQt5 QMainWindow,QDockWidget,使用屏幕尺寸适合自动调整大小

时间:2018-10-07 23:12:59

标签: python python-3.x pyqt5 qmainwindow qdockwidget

我创建了一个带有菜单栏和4个QMainWindow的{​​{1}}。第一个dockwidget内容为dockable widgets,第二个为multipletabs,第三个为Qpainter widget,第四个为Matlabplot

运行时,代码如下所示。

enter image description here

我想像下面一样。

enter image description here

我想在任何屏幕上运行时自动将屏幕划分为四个小部件,并且我希望有标签来调整其内容的大小。

或者您是否对拥有这种小部件有更好的主意,欢迎您随它一起提供。

代码更新

调整Qdockwidget的大小可将此帖子转发出去。似乎Qt Qdockwidget调整大小早已是一个问题。我发现很难用4个Qdockwidget对Qmainwindow进行编程,该Dock将根据其内容以及子窗口小部件的大小调整大小并调整其大小。根据Qt文档,Qdockwidget会调整大小并尊重子Widget的大小。为了直接解决问题,我的主窗口有4个qdockwidget,我希望根据内容调整它们的大小。

到目前为止,我一直在尝试和使用。 我使用了以下尺寸函数。

pdf report

我可以使用以下代码来固定第一个Qdockwidget中内容的大小。

self.sizeHint, self.minimumSize(), self.maximumSize() and self.setFixedSize(self.sizeHint()). 

以上代码写在子窗口小部件self.setFixedSize(self.sizeHint()) 中 但是,尽管需要运行和执行以下代码,但这还不足以使其正常工作。

Class widgets

请注意,我的停靠窗口仍然没有根据子窗口小部件调整大小。 Dockwidget扩大并增加。可能有人会问,Qdockwidgets可以通过 self.first.setMinimumSize(self.first.sizeHint()) self.grid.setMinimumSize(self.grid.sizeHint()) self.third.setMinimumSize(self.third.sizeHint()) self.adjustSize() self.first.setMinimumSize(self.first.minimumSizeHint()) self.grid.setMinimumSize(self.grid.minimumSizeHint()) self.third.setMinimumSize(self.third.minimumSizeHint()) 进行安排和控制。此代码行已使用并尝试过,但仍无法获得所需的行为。

我一直在四处看看,可以找到一些相关的问题。

C++ resize a docked Qt QDockWidget programmatically?

Forcing a QDockWidget to behave like a central widget when it comes to resizing

Create a QDockWidget that resizes to it's contents

这些问题不能解决我的问题。

可视化我的代码启动

1-运行代码并在屏幕上显示时。

enter image description here

2-首次运行软件时需要显示的内容。

enter image description here

3-当Tabwidget之间的用户标签要调整大小时,如下图所示。

enter image description here

4-代码如下。

resizeDocks()

在此方面,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

如果浮动窗口对于您的工具不是必不可少的,则可以尝试删除QDockWidget并使用一系列QSplitter。这样一来,您可以拥有不错的框布局,同时使标签可以水平和垂直调整大小,并且在整个工具调整大小时仍可以正确调整大小。

我的示例在PySide2中,但是您可能需要对PyQt5进行非常小的调整(可能只是导入名称):

from PySide2 import QtCore
from PySide2 import QtGui
from PySide2 import QtWidgets


class SubWindow(QtWidgets.QWidget):

    def __init__(self, label, parent=None):
        super(SubWindow, self).__init__(parent)

        self.label = QtWidgets.QLabel(label, parent=self)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setStyleSheet("QLabel {font-size:40px;}")

        self.main_layout = QtWidgets.QVBoxLayout()
        self.main_layout.addWidget(self.label)
        self.setLayout(self.main_layout)


class MainWindow(QtWidgets.QWidget):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.sub_win_1 = SubWindow("1", parent=self)
        self.sub_win_2 = SubWindow("2", parent=self)
        self.sub_win_3 = SubWindow("3", parent=self)
        self.sub_win_4 = SubWindow("4", parent=self)

        self.sub_splitter_1 = QtWidgets.QSplitter(QtCore.Qt.Horizontal, parent=self)
        self.sub_splitter_1.addWidget(self.sub_win_1)
        self.sub_splitter_1.addWidget(self.sub_win_2)

        self.sub_splitter_2 = QtWidgets.QSplitter(QtCore.Qt.Horizontal, parent=self)
        self.sub_splitter_2.addWidget(self.sub_win_3)
        self.sub_splitter_2.addWidget(self.sub_win_4)

        self.splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical, parent=self)
        self.splitter.addWidget(self.sub_splitter_1)
        self.splitter.addWidget(self.sub_splitter_2)

        self.main_layout = QtWidgets.QVBoxLayout()
        self.main_layout.addWidget(self.splitter)
        self.setLayout(self.main_layout)

        self.setWindowTitle("Layout example")
        self.resize(500, 500)


inst = MainWindow()
inst.show()

这给你这样的东西:

enter image description here

现在,顶部/底部水平拆分器可以单独运行,但是您可以轻松地将它们与事件绑定在一起。

希望有帮助!