我创建了一个带有菜单栏和4个QMainWindow
的{{1}}。第一个dockwidget内容为dockable widgets
,第二个为multipletabs
,第三个为Qpainter widget
,第四个为Matlabplot
。
运行时,代码如下所示。
我想像下面一样。
我想在任何屏幕上运行时自动将屏幕划分为四个小部件,并且我希望有标签来调整其内容的大小。
或者您是否对拥有这种小部件有更好的主意,欢迎您随它一起提供。
代码更新
调整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-运行代码并在屏幕上显示时。
2-首次运行软件时需要显示的内容。
3-当Tabwidget之间的用户标签要调整大小时,如下图所示。
4-代码如下。
resizeDocks()
在此方面,我将不胜感激。
答案 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()
这给你这样的东西:
现在,顶部/底部水平拆分器可以单独运行,但是您可以轻松地将它们与事件绑定在一起。
希望有帮助!