Qt:如何获取停靠窗口的初始大小?

6

当小部件被停靠时,我希望它改变方向,并相对于停靠区域的扩展拥有最小尺寸。也就是说:

  • 左/右停靠 => 垂直方向最小宽度
  • 上/下停靠 => 水平方向最小高度

问题在于,每当方向改变时,停靠区域会采用一个看似随意的宽度或高度。我找不到一种方法来调整/强制停靠小部件的特定大小。我已经尝试了无数次覆盖 sizeHintminimumSizeHint,调用 adjustSize,以及调整 sizePolicy

我该如何确保初始停靠大小?


我的基本应用程序如下图所示:

enter image description here

该应用程序显示主要和次要信息以及相应的控件集。包含主要和次要内容的选项卡小部件设置为中心小部件。 QStackedWidget 封装了各自仪表板中的控件,位于停靠区域中。当选项卡更改时,显示相应的仪表板。该代码在 基本应用程序代码中给出。

问题在于 改变仪表板方向会干扰停靠区域的大小

调整仪表板方向,我可以想到两种合理的解决方案:

  • 通过 resizeEvent
  • 通过 dockLocationChanged 信号

通过 resizeEvent 调整方向

对我来说,这似乎是更可取的选择。它允许用户最大的灵活性。如果他们不喜欢停靠区域的方向,将其拖过特定限制将使他们能够更改停靠区域的方向。 在此我检查它是否比高更宽。

    class MyDock(QtWidgets.QDockWidget):

        def __init__(self):

            super(MyDock, self).__init__()

        def resizeEvent(self, event):
            size = event.size()
            is_wide = size.width() > size.height()

            container_object = self.widget().currentWidget()

            if is_wide:
                container_object.setDirection(QtWidgets.QBoxLayout.LeftToRight)
            else:
                container_object.setDirection(QtWidgets.QBoxLayout.TopToBottom)

以下是“调整大小方法”中的完整代码:

在dockLocationChange上更改方向

由于调整大小事件始终发生,另一种方法是仅在停靠位置更改时更改方向。要实现这一点,请将函数连接到dockLocationChanged信号,并根据停靠位置调整方向。

    class MyDock(QtWidgets.QDockWidget):

        def __init__(self):

            super(MyDock, self).__init__()

            self.dockLocationChanged.connect(self.dock_location_changed)

        def dock_location_changed(self, area):
            top    = QtCore.Qt.DockWidgetArea.TopDockWidgetArea
            bottom = QtCore.Qt.DockWidgetArea.BottomDockWidgetArea

            container_object = self.widget().currentWidget()

            if area in [top, bottom]:
                container_object.setDirection(QtWidgets.QBoxLayout.LeftToRight)
            else:
                container_object.setDirection(QtWidgets.QBoxLayout.TopToBottom)

基本应用程序代码

该程序由5个单独的类组成。

对于 MyWindow, PrimaryDashboardSecondaryDashboard,分离的原因应该很清楚。

对于 MyDockDockContainer,分离是为了方便覆盖 sizeHintsetDirection 或其他方法。

    import qtpy
    from qtpy import QtWidgets, QtGui, QtCore
    import sys


    class PrimaryDashboard(QtWidgets.QWidget):

        def __init__(self):

            super(PrimaryDashboard, self).__init__()

            self.init_widgets()
            self.init_layout()

        def init_widgets(self):
            self.label = QtWidgets.QLabel('Primary dashboard')
            self.ok = QtWidgets.QPushButton('OK')
            self.cancel = QtWidgets.QPushButton('Cancel')

        def init_layout(self):
            self.layout = QtWidgets.QHBoxLayout()
            self.layout.addWidget(self.label)
            self.layout.addWidget(self.ok)
            self.layout.addWidget(self.cancel)
            self.setLayout(self.layout)

        def setDirection(self, direction):
            self.layout.setDirection(direction)


    class SecondaryDashboard(QtWidgets.QWidget):

        def __init__(self):

            super(SecondaryDashboard, self).__init__()

            self.init_widgets()
            self.init_layout()

        def init_widgets(self):
            self.label = QtWidgets.QLabel('Secondary dashboard')

            self.descr1 = QtWidgets.QLabel('Thing 1')
            self.check1 = QtWidgets.QCheckBox()

            self.descr2 = QtWidgets.QLabel('Thing 2')
            self.check2 = QtWidgets.QCheckBox()

        def init_layout(self):
            self.layout = QtWidgets.QVBoxLayout()

            self.grid = QtWidgets.QGridLayout()
            self.grid.addWidget(self.descr1, 0, 0)
            self.grid.addWidget(self.check1, 0, 1)
            self.grid.addWidget(self.descr2, 1, 0)
            self.grid.addWidget(self.check2, 1, 1)

            self.layout.addWidget(self.label)
            self.layout.addLayout(self.grid)
            self.setLayout(self.layout)

        def setDirection(self, direction):
            self.layout.setDirection(direction)


    class DockContainer(QtWidgets.QStackedWidget):

        def __init__(self):

            super(DockContainer, self).__init__()


    class MyDock(QtWidgets.QDockWidget):

        def __init__(self):

            super(MyDock, self).__init__()


    class MyWindow(QtWidgets.QMainWindow):

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

            self.resize(600, 400)

            self.init_widgets()
            self.init_layout()

        def init_widgets(self):

            self.tab_widget = QtWidgets.QTabWidget()
            self.tab1 = QtWidgets.QLabel('Primary content')
            self.tab2 = QtWidgets.QLabel('Secondary content')
            self.tab_widget.addTab(self.tab1, 'Primary')
            self.tab_widget.addTab(self.tab2, 'Secondary')
            self.tab_widget.currentChanged.connect(self.tab_selected)

            self.primary_dashboard = PrimaryDashboard()
            self.secondary_dashboard = SecondaryDashboard()

            self.dashboard = DockContainer()
            self.dashboard.addWidget(self.primary_dashboard)
            self.dashboard.addWidget(self.secondary_dashboard)
            self.dashboard.setCurrentWidget(self.primary_dashboard)

            self.dock = MyDock()
            self.dock.setWidget(self.dashboard)
            self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.dock)

        def init_layout(self):
            self.main_layout = QtWidgets.QVBoxLayout()
            self.main_layout.addWidget(self.tab_widget)

            self.main_widget = QtWidgets.QWidget()
            self.main_widget.setLayout(self.main_layout)
            self.setCentralWidget(self.main_widget)

        def tab_selected(self):
            tab_index = self.tab_widget.currentIndex()
            if self.tab_widget.tabText(tab_index) == 'Secondary':
                self.dashboard.setCurrentWidget(self.secondary_dashboard)
                self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.dock)
            else:  # Primary
                self.dashboard.setCurrentWidget(self.primary_dashboard)
                self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.dock)


    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)

        window = MyWindow()
        window.show()
        sys.exit(app.exec_())

调整大小方法

此代码与基本应用程序代码相同,但在停靠窗口小部件中覆盖了resizeEvent

    import qtpy
    from qtpy import QtWidgets, QtGui, QtCore
    import sys


    class PrimaryDashboard(QtWidgets.QWidget):

        def __init__(self):

            super(PrimaryDashboard, self).__init__()

            self.init_widgets()
            self.init_layout()

        def init_widgets(self):
            self.label = QtWidgets.QLabel('Primary dashboard')
            self.ok = QtWidgets.QPushButton('OK')
            self.cancel = QtWidgets.QPushButton('Cancel')

        def init_layout(self):
            self.layout = QtWidgets.QHBoxLayout()
            self.layout.addWidget(self.label)
            self.layout.addWidget(self.ok)
            self.layout.addWidget(self.cancel)
            self.setLayout(self.layout)

        def setDirection(self, direction):
            self.layout.setDirection(direction)


    class SecondaryDashboard(QtWidgets.QWidget):

        def __init__(self):

            super(SecondaryDashboard, self).__init__()

            self.init_widgets()
            self.init_layout()

        def init_widgets(self):
            self.label = QtWidgets.QLabel('Secondary dashboard')

            self.descr1 = QtWidgets.QLabel('Thing 1')
            self.check1 = QtWidgets.QCheckBox()

            self.descr2 = QtWidgets.QLabel('Thing 2')
            self.check2 = QtWidgets.QCheckBox()

        def init_layout(self):
            self.layout = QtWidgets.QVBoxLayout()

            self.grid = QtWidgets.QGridLayout()
            self.grid.addWidget(self.descr1, 0, 0)
            self.grid.addWidget(self.check1, 0, 1)
            self.grid.addWidget(self.descr2, 1, 0)
            self.grid.addWidget(self.check2, 1, 1)

            self.layout.addWidget(self.label)
            self.layout.addLayout(self.grid)
            self.setLayout(self.layout)

        def setDirection(self, direction):
            self.layout.setDirection(direction)


    class DockContainer(QtWidgets.QStackedWidget):

        def __init__(self):

            super(DockContainer, self).__init__()


    class MyDock(QtWidgets.QDockWidget):

        def __init__(self):

            super(MyDock, self).__init__()

        def resizeEvent(self, event):
            size = event.size()
            is_wide = size.width() > size.height()

            container_object = self.widget().currentWidget()

            if is_wide:
                container_object.setDirection(QtWidgets.QBoxLayout.LeftToRight)
            else:
                container_object.setDirection(QtWidgets.QBoxLayout.TopToBottom)


    class MyWindow(QtWidgets.QMainWindow):

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

            self.resize(600, 400)

            self.init_widgets()
            self.init_layout()

        def init_widgets(self):

            self.tab_widget = QtWidgets.QTabWidget()
            self.tab1 = QtWidgets.QLabel('Primary content')
            self.tab2 = QtWidgets.QLabel('Secondary content')
            self.tab_widget.addTab(self.tab1, 'Primary')
            self.tab_widget.addTab(self.tab2, 'Secondary')
            self.tab_widget.currentChanged.connect(self.tab_selected)

            self.primary_dashboard = PrimaryDashboard()
            self.secondary_dashboard = SecondaryDashboard()

            self.dashboard = DockContainer()
            self.dashboard.addWidget(self.primary_dashboard)
            self.dashboard.addWidget(self.secondary_dashboard)
            self.dashboard.setCurrentWidget(self.primary_dashboard)

            self.dock = MyDock()
            self.dock.setWidget(self.dashboard)
            self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.dock)

        def init_layout(self):
            self.main_layout = QtWidgets.QVBoxLayout()
            self.main_layout.addWidget(self.tab_widget)

            self.main_widget = QtWidgets.QWidget()
            self.main_widget.setLayout(self.main_layout)
            self.setCentralWidget(self.main_widget)

        def tab_selected(self):
            tab_index = self.tab_widget.currentIndex()
            if self.tab_widget.tabText(tab_index) == 'Secondary':
                self.dashboard.setCurrentWidget(self.secondary_dashboard)
                self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.dock)
            else:  # Primary
                self.dashboard.setCurrentWidget(self.primary_dashboard)
                self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.dock)


    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)

        window = MyWindow()
        window.show()
        sys.exit(app.exec_())

dockLocationChanged方法

这段代码与基本应用程序代码相同,只是将dockLocationChanged信号连接到一个方法,该方法根据当前停靠位置调整方向。

    import qtpy
    from qtpy import QtWidgets, QtGui, QtCore
    import sys


    class PrimaryDashboard(QtWidgets.QWidget):

        def __init__(self):

            super(PrimaryDashboard, self).__init__()

            self.init_widgets()
            self.init_layout()

        def init_widgets(self):
            self.label = QtWidgets.QLabel('Primary dashboard')
            self.ok = QtWidgets.QPushButton('OK')
            self.cancel = QtWidgets.QPushButton('Cancel')

        def init_layout(self):
            self.layout = QtWidgets.QHBoxLayout()
            self.layout.addWidget(self.label)
            self.layout.addWidget(self.ok)
            self.layout.addWidget(self.cancel)
            self.setLayout(self.layout)

        def setDirection(self, direction):
            self.layout.setDirection(direction)


    class SecondaryDashboard(QtWidgets.QWidget):

        def __init__(self):

            super(SecondaryDashboard, self).__init__()

            self.init_widgets()
            self.init_layout()

        def init_widgets(self):
            self.label = QtWidgets.QLabel('Secondary dashboard')

            self.descr1 = QtWidgets.QLabel('Thing 1')
            self.check1 = QtWidgets.QCheckBox()

            self.descr2 = QtWidgets.QLabel('Thing 2')
            self.check2 = QtWidgets.QCheckBox()

        def init_layout(self):
            self.layout = QtWidgets.QVBoxLayout()

            self.grid = QtWidgets.QGridLayout()
            self.grid.addWidget(self.descr1, 0, 0)
            self.grid.addWidget(self.check1, 0, 1)
            self.grid.addWidget(self.descr2, 1, 0)
            self.grid.addWidget(self.check2, 1, 1)

            self.layout.addWidget(self.label)
            self.layout.addLayout(self.grid)
            self.setLayout(self.layout)

        def setDirection(self, direction):
            self.layout.setDirection(direction)


    class DockContainer(QtWidgets.QStackedWidget):

        def __init__(self):

            super(DockContainer, self).__init__()


    class MyDock(QtWidgets.QDockWidget):

        def __init__(self):

            super(MyDock, self).__init__()

            self.dockLocationChanged.connect(self.dock_location_changed)

        def dock_location_changed(self, area):
            top    = QtCore.Qt.DockWidgetArea.TopDockWidgetArea
            bottom = QtCore.Qt.DockWidgetArea.BottomDockWidgetArea
            # left   = QtCore.Qt.DockWidgetArea.LeftDockWidgetArea
            # right  = QtCore.Qt.DockWidgetArea.RightDockWidgetArea

            container_object = self.widget().currentWidget()

            if area in [top, bottom]:
                container_object.setDirection(QtWidgets.QBoxLayout.LeftToRight)
            else:
                container_object.setDirection(QtWidgets.QBoxLayout.TopToBottom)


    class MyWindow(QtWidgets.QMainWindow):

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

            self.resize(600, 400)

            self.init_widgets()
            self.init_layout()

        def init_widgets(self):

            self.tab_widget = QtWidgets.QTabWidget()
            self.tab1 = QtWidgets.QLabel('Primary content')
            self.tab2 = QtWidgets.QLabel('Secondary content')
            self.tab_widget.addTab(self.tab1, 'Primary')
            self.tab_widget.addTab(self.tab2, 'Secondary')
            self.tab_widget.currentChanged.connect(self.tab_selected)

            self.primary_dashboard = PrimaryDashboard()
            self.secondary_dashboard = SecondaryDashboard()

            self.dashboard = DockContainer()
            self.dashboard.addWidget(self.primary_dashboard)
            self.dashboard.addWidget(self.secondary_dashboard)
            self.dashboard.setCurrentWidget(self.primary_dashboard)

            self.dock = MyDock()
            self.dock.setWidget(self.dashboard)
            self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.dock)

        def init_layout(self):
            self.main_layout = QtWidgets.QVBoxLayout()
            self.main_layout.addWidget(self.tab_widget)

            self.main_widget = QtWidgets.QWidget()
            self.main_widget.setLayout(self.main_layout)
            self.setCentralWidget(self.main_widget)

        def tab_selected(self):
            tab_index = self.tab_widget.currentIndex()
            if self.tab_widget.tabText(tab_index) == 'Secondary':
                self.dashboard.setCurrentWidget(self.secondary_dashboard)
                self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.dock)
            else:  # Primary
                self.dashboard.setCurrentWidget(self.primary_dashboard)
                self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.dock)


    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)

        window = MyWindow()
        window.show()
        sys.exit(app.exec_())
1个回答

3
将应用程序视为一组 玛特里奥什卡娃娃。内部娃娃的大小决定了随后外部娃娃的大小。显然,内部娃娃不能比包含它的娃娃更大!QWidgets 的建模方式类似。

默认情况下,不提供大小提示的复合小部件将根据其子小部件的空间要求进行调整大小。

QWidget.sizeHint() 的文档继续说道:

如果此小部件没有布局,则 QWidget.sizeHint() 的默认实现将返回无效大小,并返回布局的首选大小。

总之,小部件的大小调整是从内向外基于布局的。

如果你要为基础应用程序代码中的每个对象实现一个resizeEvent1,则会看到以下大小调整的顺序:
  1. PrimaryDashboard的resizeEvent
  2. DockContainer的resizeEvent
  3. MyDock的resizeEvent
这就是我们期望的嵌套方式。首先查询PrimaryDashboard的大小,然后查询DockContainer,最后查询MyDock。从技术上讲,它一直是小部件。但是,PrimaryDashboard包含按钮和标签,这些按钮和标签在大多数情况下应该比MainWindow的宽度/高度小。在影响停靠大小的序列中,第一个具有重要影响的是PrimaryDashboard
检查resizeEvent,使用event.size(),我们可以看到水平仪表板的合理最小高度为120像素,而垂直方向则有一个合理的最小宽度为146。然后,sizeHint()可以设置为返回minimumSizeHint(),并且将最小值设置为每个仪表板的(146, 120)2。实际上,这告诉应用程序优先考虑(146, 120)的最小尺寸,同时仍允许一般的调整大小。
def sizeHint(self):
    return self.minimumSizeHint()

def minimumSizeHint(self):
    return QtCore.QSize(146, 120)

使用固定大小可能存在危险,因为绝对值是不可变的,而且本质上不具有灵活性。但是,内容很可能有一个自然的最小尺寸3。我们可以在整个应用程序上简单地使用setMinimumSize(),以不允许调整大小小于我们的minimumSizeHint()
要更改停靠窗口内容的方向,我们可以使用dockLocationChanged信号。我们还可以使代码比问题中呈现的更加整洁。我们可以在MyWindow内部的实例级别上连接信号,而不是在停靠窗口内部连接。事实上,根本没有必要定义MyDock。一个普通的QDockWidget就足够了。
带有最小初始大小的停靠窗口
import qtpy
from qtpy import QtWidgets, QtGui, QtCore
import sys


class PrimaryDashboard(QtWidgets.QWidget):

    def __init__(self):

        super(PrimaryDashboard, self).__init__()

        self.init_widgets()
        self.init_layout()

    def init_widgets(self):
        self.label = QtWidgets.QLabel('Primary dashboard')
        self.ok = QtWidgets.QPushButton('OK')
        self.cancel = QtWidgets.QPushButton('Cancel')

    def init_layout(self):
        self.layout = QtWidgets.QHBoxLayout()
        self.layout.addWidget(self.label)
        self.layout.addWidget(self.ok)
        self.layout.addWidget(self.cancel)
        self.setLayout(self.layout)

    def setDirection(self, direction):
        self.layout.setDirection(direction)

    def sizeHint(self):
        return self.minimumSizeHint()

    def minimumSizeHint(self):
        return QtCore.QSize(146, 120)


class SecondaryDashboard(QtWidgets.QWidget):

    def __init__(self):

        super(SecondaryDashboard, self).__init__()

        self.init_widgets()
        self.init_layout()

    def init_widgets(self):
        self.label = QtWidgets.QLabel('Secondary dashboard')

        self.descr1 = QtWidgets.QLabel('Thing 1')
        self.check1 = QtWidgets.QCheckBox()

        self.descr2 = QtWidgets.QLabel('Thing 2')
        self.check2 = QtWidgets.QCheckBox()

    def init_layout(self):
        self.layout = QtWidgets.QVBoxLayout()

        self.grid = QtWidgets.QGridLayout()
        self.grid.addWidget(self.descr1, 0, 0)
        self.grid.addWidget(self.check1, 0, 1)
        self.grid.addWidget(self.descr2, 1, 0)
        self.grid.addWidget(self.check2, 1, 1)

        self.layout.addWidget(self.label)
        self.layout.addLayout(self.grid)
        self.setLayout(self.layout)

    def setDirection(self, direction):
        self.layout.setDirection(direction)

    def sizeHint(self):
        return self.minimumSizeHint()

    def minimumSizeHint(self):
        return QtCore.QSize(146, 120)


class DockContainer(QtWidgets.QStackedWidget):

    def __init__(self):

        super(DockContainer, self).__init__()

    def dock_location_changed(self, area):
        top    = QtCore.Qt.DockWidgetArea.TopDockWidgetArea
        bottom = QtCore.Qt.DockWidgetArea.BottomDockWidgetArea

        container_object = self.currentWidget()

        if area in [top, bottom]:
            container_object.setDirection(QtWidgets.QBoxLayout.LeftToRight)
        else:
            container_object.setDirection(QtWidgets.QBoxLayout.TopToBottom)


class MyWindow(QtWidgets.QMainWindow):

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

        # Force minimumSize to ensure a sensible dashboard size
        self.setMinimumSize(QtCore.QSize(600, 400))

        self.init_widgets()
        self.init_layout()

    def init_widgets(self):

        self.tab_widget = QtWidgets.QTabWidget()
        self.tab1 = QtWidgets.QLabel('Primary content')
        self.tab2 = QtWidgets.QLabel('Secondary content')
        self.tab_widget.addTab(self.tab1, 'Primary')
        self.tab_widget.addTab(self.tab2, 'Secondary')
        self.tab_widget.currentChanged.connect(self.tab_selected)

        self.primary_dashboard = PrimaryDashboard()
        self.secondary_dashboard = SecondaryDashboard()

        self.dashboard = DockContainer()
        self.dashboard.addWidget(self.primary_dashboard)
        self.dashboard.addWidget(self.secondary_dashboard)
        self.dashboard.setCurrentWidget(self.primary_dashboard)

        self.dock = QtWidgets.QDockWidget()
        self.dock.setWidget(self.dashboard)
        self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.dock)

        # Connect signal at the main application level
        self.dock.dockLocationChanged.connect(self.dashboard.dock_location_changed)

    def init_layout(self):
        self.main_layout = QtWidgets.QVBoxLayout()
        self.main_layout.addWidget(self.tab_widget)

        self.main_widget = QtWidgets.QWidget()
        self.main_widget.setLayout(self.main_layout)
        self.setCentralWidget(self.main_widget)

    def tab_selected(self):
        tab_index = self.tab_widget.currentIndex()
        if self.tab_widget.tabText(tab_index) == 'Secondary':
            self.dashboard.setCurrentWidget(self.secondary_dashboard)
            self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.dock)
        else:  # Primary
            self.dashboard.setCurrentWidget(self.primary_dashboard)
            self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.dock)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    window = MyWindow()
    window.show()
    sys.exit(app.exec_())


1. 如何实现resizeEvent以查看谁在调整大小:

    def resizeEvent(self, event):
        print('resizeEvent for ', self, flush=True)

2. 一个自然的问题是,"为什么不直接将 sizeHint() 设置为返回最小尺寸,而是调用 minimumSizeHint()?" 我的最佳答案是,"它不会按照你的期望工作。" 只设置 sizeHint() 并不能将停靠窗口调整到最小尺寸。

sizeHint()minimumSizeHint() 方法都是虚函数。我猜测 Qt 具有其他我们无法了解的功能,可以独立引用这些方法,因此需要我们按照这种方式定义。

3. 如果内容是地图,例如,用户不太可能希望地图大小为 10px x 10px。此外,合理的假设是,用户不会使用分辨率小于 600 x 400 的屏幕,除非他们使用移动设备。但如果您正在使用 PySide 或 PyQt5 开发移动应用程序,则应该问自己一些重要的问题,例如 "为什么?"


QStackedWidget继承DockContainer类的原因是什么?相比于仅使用QWidget,这样做是否有一些好处? - tdpu
QStackedWidget被用于当方向改变时切换显示的小部件。对于仅关于布局的MRE,您是正确的,这可能并不必要。 - Lorem Ipsum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接