PyQt5调用子窗口

Posted 蚂蚁小兵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PyQt5调用子窗口相关的知识,希望对你有一定的参考价值。

作为一个非QT的专业认识,但是工作中用的它开发一些内部使用的工具,时间短,没有很多的时间去研究QT,所以设计UI的时候需要用QtDesigner去设计就好,让我自己在代码中手敲代码去布局那是十分难的,特别是调用子面板的时候,总是手敲布局代码,后来学习到了,博客记录下过程。

——————————————————————————————————————————

  • 最终想实现的就是如下图所示:

  • 测试软件环境:
    python3.8 x64
    pycharm
    pyqt5 5.16

防止copy 出错,源码我放在了Git上,有需自取


1,新建一个主窗口UI : main_ui.ui



2,新建一个子窗口UI , 类型选择 Diaglog 类型 sub_diaglou_ui.ui


3,生成main_ui.py 和 sub_diaglou_ui.py文件,这里如果没有外部工具,怎么添加外部工具,可以参考下一步骤



4,外部工具的设置



5 ,main_call_sub_ui.py 代码如下:

真正的是UI文件和主main文件分离,每次更新UI,只需要不断的更新UI文件就可以了

from PyQt5.QtWidgets import QMainWindow, QApplication, QDialog
from main_ui import Ui_MainWindow
from sub_diaglou_ui import Ui_Dialog

class ShowDialog(QDialog, Ui_Dialog): # 子面板
    def __init__(self, parent=None):
        super(ShowDialog, self).__init__(parent)
        self.setupUi(self)  # 调用写在视图层文件的页面布局函数

    def closeEvent(self, event):
        print("closed dialog")


class MainQt(QMainWindow,Ui_MainWindow): # 主面板
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.pushButton.clicked.connect(self.show_diaglog)

    def show_diaglog(self):
        print("call sub panel")
        dlg = ShowDialog(self)
        dlg.exec_()

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    mian_ui = MainQt()
    mian_ui.show()
    sys.exit(app.exec_())



6,最后汇总下 print 函数重定向和子面板调用,基本结构如下:

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QDialog
from PyQt5.QtGui import QTextCursor
from PyQt5.QtCore import QObject, pyqtSignal

from main_ui import Ui_MainWindow
from sub_diaglou_ui import Ui_Dialog
from nprintf import nprintf


temp = sys.stdout
class Stream(QObject):
    newText = pyqtSignal(str)
    def write(self, text):
        self.newText.emit(str(text))
        QApplication.processEvents()


class ShowDialog(QDialog, Ui_Dialog):  # Python多继承
    def __init__(self, parent=None):
        super(ShowDialog, self).__init__(parent)
        self.setupUi(self)  # 调用写在视图层文件的页面布局函数

    def closeEvent(self, event):
        nprintf("closed dialog")

class MainQt(QMainWindow,Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        '''流重定向'''
        sys.stdout = Stream(newText=self.onUpdateEdit)
        self.pushButton.clicked.connect(self.print_test)
        self.pushButton_2.clicked.connect(self.show_diaglog)

    def print_test(self):
        nprintf("这是文件main.py")
        from becalled_a import print_a
        from becalled_b import print_b
        print_a()
        print_b()

    def show_diaglog(self):
        nprintf("call sub panel")
        dlg = ShowDialog(self)
        dlg.exec_()


        '''关闭app事件响应'''
    def closeEvent(self, event):
        """Shuts down application on close."""
        # Return stdout to defaults.
        self.ms.close()
        sys.stdout = temp
        super().closeEvent(event)

    '''绑定输出流'''

    def onUpdateEdit(self, text):
        cursor = self.textEdit.textCursor()
        cursor.movePosition(QTextCursor.End)
        cursor.insertText(text)
        self.textEdit.setTextCursor(cursor)
        self.textEdit.ensureCursorVisible()

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    mian_ui = MainQt()
    mian_ui.show()
    sys.exit(app.exec_())

感谢欣赏,如有帮助,点赞留香

以上是关于PyQt5调用子窗口的主要内容,如果未能解决你的问题,请参考以下文章

pyqt5实现打开子窗口

Qt Designer PyQt5 覆盖 CloseEvent 子窗口不起作用

PyQt5从子窗口关闭父窗口和子窗口

如何在 PyQt5 中相对于父窗口移动子窗口?

pyqt中QMdiArea子窗口关闭的问题

[pyqt5][python][原创]pyqt5登陆界面跳转并关闭子窗口全部退出