从多个类组成 PyQt5 UI

Posted

技术标签:

【中文标题】从多个类组成 PyQt5 UI【英文标题】:Compose a PyQt5 UI from multiple classes 【发布时间】:2019-07-20 16:54:06 【问题描述】:

我有一个在 QT Designer 中设计的 UI。它由三个选项卡组成:

1 - 测试; 2 - 训练哈尔; 3 - 训练猪;

在每个选项卡中,我都有一些按钮、一些行或一些小部件,但是当我创建代码以向这些按钮或小部件添加功能时,我希望每个选项卡都有 3 个类,一个类仅用于第一个选项卡,一类仅用于第二个选项卡,依此类推.. 第四类调用所有三个类并编写我的 UI。我不知道该怎么做,我需要每个类都继承自 QMainWindow?我需要在每个班级都设置 Ui 吗?

这是我当前的代码:

import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from Qt_designer_UI import Ui_MainWindow

class Test(QtWidgets.QMainWindow):
    def __init__(self):
        super(Test, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

class Train_Haar(QtWidgets.QMainWindow):
    def __init__(self):
        super(Train_Haar, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)


class Train_HOG(QtWidgets.QMainWindow):
    def __init__(self):
        super(Train_HOG, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)


class Compose_UI(QtWidgets.QMainWindow):
    def __init__(self):
        super(Compose_UI, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        Test()
        Train_Haar()
        Train_HOG



if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = Compose_UI()
    window.show()
    sys.exit(app.exec_())

【问题讨论】:

【参考方案1】:

我需要每个类都继承自 QMainWindow?

不,没有必要,因为它是一个将在选项卡内的小部件,并且该小部件可以是任何类型。

我需要在每个班级都设置 Ui 吗?

只有在 pyuic 和 Qt Designer 的帮助下使用生成的类时才必须调用 setupUi,在您的情况下,每个选项卡中的小部件都是使用 Qt Designer 生成的?我发现我没有

请记住,您的 .ui 是

一个可能的解决方案是:

import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from Qt_designer_UI import Ui_MainWindow


class Test(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Test, self).__init__(parent)
        # for testing
        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(QtWidgets.QPushButton("Test"))


class Train_Haar(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Train_Haar, self).__init__(parent)
        # for testing
        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(QtWidgets.QPushButton("Train_Haar"))


class Train_HOG(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Train_HOG, self).__init__(parent)
        # for testing
        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(QtWidgets.QPushButton("Train_HOG"))


class Compose_UI(QtWidgets.QMainWindow):
    def __init__(self):
        super(Compose_UI, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        test = Test()
        train_haar = Train_Haar()
        train_hog = Train_HOG()

        for w, tab in zip(
            (test, train_haar, train_hog), (self.ui.tab1, self.ui.tab2, self.ui.tab3)
        ):
            lay = QtWidgets.QVBoxLayout(tab)
            lay.addWidget(w)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = Compose_UI()
    window.show()
    sys.exit(app.exec_())

【讨论】:

@eyllanesc 我真的很抱歉,我从昨晚开始一直在寻找这个问题,但无法解决它,也不知道如何解决,所以我知道你是一个积极的帮助者,所以我标记了你真的很抱歉为此 @eyllanesc 先生“Raju”是我的朋友,这是他的 acc,他也在 pyqt 上做一个项目,所以他问我如何解决我不知道该怎么做所以我问他在这里发帖。由于没有回复,我在这里标记了你,因为这篇文章有点相关 @eyllanesc 先生,我会努力改进它们,对不起。你能帮我解决我标记的查询吗?先生,谢谢先生

以上是关于从多个类组成 PyQt5 UI的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PyQt5 / PySide2 中从一个类访问属性到另一个类

PyQt5如何在主UI中实例化多个UI

在 PyQt5 中显示和隐藏多个窗口

我如何分析由多个模块和类组成的 python 脚本?

PyQt5应用与实践

Python+PyQT5的子线程更新UI界面的实例《新手必学》