【问题标题】:(PyQt) QVBoxLayout shrink upon multiple loading of addWidget(PyQt) QVBoxLayout 在多次加载 addWidget 时缩小
【发布时间】:2017-08-21 21:38:50
【问题描述】:

为什么布局会像这样缩小,而其他时候又恢复正常?

我在 QtDesigner 中创建了几个单独的 UI 文件,一个是 MainWindow,另一个是用于加载数据的小部件。

为了使用这些文件,我为每个 UI 文件创建了单独的子类。为了向 MainWindow 添加一个新的小部件,我创建了一个 addWidget() 函数;它通过将特定的小部件添加到滚动区域布局来工作。你可以在MainWindow.py看到这个功能


这是__main__.py的代码

import multiprocessing as mp
import os.path
import sys
import time

from PyQt5 import QtGui
from PyQt5 import QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import *

from point_spectra_gui.future_.functions import *
from point_spectra_gui.future_.util import delete
from point_spectra_gui.future_.util.excepthook import my_exception_hook


def new():
    p = mp.Process(target=main, args=())
    p.start()


def connectWidgets(ui):
    ui.actionLoad_Data.triggered.connect(lambda: ui.addWidget(LoadData.Ui_Form))


def main():
    sys._excepthook = sys.excepthook
    sys.excepthook = my_exception_hook

    app = QtWidgets.QApplication(sys.argv)
    mainWindow = QtWidgets.QMainWindow()
    ui = MainWindow.Ui_MainWindow()
    ui.setupUi(mainWindow)
    connectWidgets(ui)
    mainWindow.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()


这是MainWindow.py的代码

from PyQt5 import QtWidgets

from point_spectra_gui.future_.functions import *
from point_spectra_gui.future_.util import *
from point_spectra_gui.ui import MainWindow


class Ui_MainWindow(MainWindow.Ui_MainWindow):
    def setupUi(self, MainWindow):
        self.MainWindow = MainWindow
        super().setupUi(MainWindow)  # Run the basic window UI
        self.menu_item_shortcuts()  # set up the shortcuts

    def addWidget(self, object):
        widget = object()
        widget.setupUi(self.scrollArea)
        self.widgetLayout = QtWidgets.QVBoxLayout()
        self.widgetLayout.setObjectName("widgetLayout")
        self.verticalLayout_3.addLayout(self.widgetLayout)
        self.widgetLayout.addWidget(widget.get_widget())

    def menu_item_shortcuts(self):
        self.actionExit.setShortcut("ctrl+Q")
        self.actionCreate_New_Workflow.setShortcut("ctrl+N")
        self.actionOpen_Workflow.setShortcut("ctrl+O")
        self.actionRestore_Workflow.setShortcut("ctrl+R")
        self.actionSave_Current_Workflow.setShortcut("ctrl+S")


这里是子类LoadData.py的代码

from PyQt5 import QtWidgets

from point_spectra_gui.ui.LoadData import Ui_loadData


class Ui_Form(Ui_loadData):
    def setupUi(self, Form):
        super().setupUi(Form)
        self.connectWidgets()

    def get_widget(self):
        return self.groupBox

    def connectWidgets(self):
        self.newFilePushButton.clicked.connect(lambda: self.on_getDataButton_clicked())
        # self.get_data_line_edit.textChanged.connect(lambda: self.get_data_params())
        # self.dataname.textChanged.connect(lambda: self.get_data_params())

    def on_getDataButton_clicked(self):
        filename, _filter = QtWidgets.QFileDialog.getOpenFileName(None, "Open Data File", '.', "(*.csv)")
        self.fileNameLineEdit.setText(filename)
        if self.fileNameLineEdit.text() == "":
            self.fileNameLineEdit.setText("*.csv")


**编辑

再次尝试此操作然后缩小窗口。布局恢复正常。 这对我来说告诉我这不是我的代码的问题,这是 Qt 处理添加小部件的方式。我仍然不明白为什么会这样。因此,非常感谢您对这是如何发生的任何见解。

【问题讨论】:

  • 请阅读有关如何提供minimal reproducible example 的指南。您问题中的代码不可运行,因为缺少几个类。它还包括一些与您的问题无关的其他元素。

标签: python qt pyqt qvboxlayout


【解决方案1】:

这个问题出在生成代码中的Form.resize()

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)

要解决此问题,您需要进入 QtDesigner 并通过单击红色圆圈项将几何图形设置回其默认布局大小。

这实质上是删除resize方法调用

然后您可以使用 pyuic 再次转换

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 2015-06-09
    • 2020-03-19
    • 1970-01-01
    相关资源
    最近更新 更多