如何在 QGridLayout 中为隐藏的 QtWaitingSpinner 保留空间?

Posted

技术标签:

【中文标题】如何在 QGridLayout 中为隐藏的 QtWaitingSpinner 保留空间?【英文标题】:How to reserve space for hidden QtWaitingSpinner in QGridLayout? 【发布时间】:2019-02-11 00:27:30 【问题描述】:

我正在尝试构建一个使用 QtWaitingSpinner 的 QtGui 应用程序:https://github.com/z3ntu/QtWaitingSpinner。我在 QGridLayout 中有它。但是,这意味着当微调器取消隐藏并启动时,它旁边的按钮会改变大小。如何在网格中为微调器保留正确的空间量,以便无论是否显示微调器,其旁边的按钮都保持恒定大小?

根据这个***帖子How to use spacers in Qt,我怀疑答案涉及QSpacerItem。但是,我不知道如何根据微调器需要的大小来调整 QSpacerItem 的大小。

这是显示我的问题的代码的最小示例:

import PyQt5.QtWidgets as QWidgets
import PyQt5.QtCore as QtCore
import PyQt5.QtGui as QtGui
from waitingspinnerwidget import QtWaitingSpinner
import sys

class Example_Window(QWidgets.QWidget):
    def __init__(self):
        super(QWidgets.QWidget,self).__init__()
        self.initUI()

    def initUI(self):
        self.button=QWidgets.QPushButton("Start/Stop Spinner")
        self.button.clicked.connect(self.toggle_spinner)
        self.spinner = QtWaitingSpinner(self,centerOnParent=False)
        self.grid = QWidgets.QGridLayout()
        self.grid.addWidget(self.button,0,0)
        self.grid.addWidget(self.spinner,0,1)
        self.setLayout(self.grid)
        self.show()

    def toggle_spinner(self):
        if self.spinner.isSpinning():
            self.spinner.stop()
        else:
            self.spinner.start()

if __name__ == '__main__':
    app = QWidgets.QApplication([])
    main = Example_Window()
    sys.exit(app.exec())    

【问题讨论】:

【参考方案1】:

试试看:

import PyQt5.QtWidgets as QWidgets
import PyQt5.QtCore as QtCore
import PyQt5.QtGui as QtGui
from waitingspinnerwidget import QtWaitingSpinner
import sys

class Example_Window(QWidgets.QWidget):
    def __init__(self):
        super(QWidgets.QWidget,self).__init__()

        self.initUI()

    def initUI(self):
        self.button = QWidgets.QPushButton("Start Spinner") # +
        self.button.clicked.connect(self.toggle_spinner)

        self.spinner = QtWaitingSpinner(self, centerOnParent=False)

        self.grid = QWidgets.QGridLayout()
        self.grid.addWidget(self.button, 0, 0)

#        self.grid.addWidget(self.spinner,0,1)        # ---
        self.grid.addWidget(self.spinner, 0, 1, 1, 2) # +++    <---

        self.setLayout(self.grid)
        self.show()

    def toggle_spinner(self):
        if self.spinner.isSpinning():
            self.spinner.stop()
            self.button.setText("Start Spinner") # +
        else:
            self.spinner.start()
            self.button.setText("Stop Spinner")  # +

if __name__ == '__main__':
    app = QWidgets.QApplication([])
    main = Example_Window()
    main.resize(170, 70)                               # +++
    sys.exit(app.exec())    

【讨论】:

以上是关于如何在 QGridLayout 中为隐藏的 QtWaitingSpinner 保留空间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PyQt5 中为 QGridLayout 添加拉伸?

如何重置QGridLayout中窗口小部件的列跨度?

QScrollArea 搞砸了 QGridLayout:QGridLayout 隐藏并且没有滚动

隐藏子小部件时,QGridLayout 未调整大小或重新绘制

如何在iOS中为整个应用程序设置隐藏状态栏?

如何在代码隐藏中为 Datepicker 设置日期/获取日期