Notodontidae 发表于 2024-7-14 17:28:26

[pyqt5]如何在前后台分离,且两个不同的.py中,将QWidget绑定到QMainWindow上

其中负责QMainWindow模块的.py没有做前后台,为一个文件
负责QWidget模块的.py分离了前后台

然而从zero_wind_act.py启动后只显示空白的QMainWindow界面,并没有把QWidget成功绑定上去,并没有显示QWidget内容,求解。


负责QMainWindow模块的zero_wind_act.py:

import sys
import zero_widgets_act


from PyQt5 import QtCore,QtGui,QtWidgets
from PIL import Image

sys.path.append(r'G:\\pythoncodes\\qt5')

class ZeroWindowAct(QtWidgets.QMainWindow):
    def __init__(self):
      super(ZeroWindowAct, self).__init__()
      self.setupWidget()

    def setupWidget(self):
      self.resize(1080, 720)
      self.setWindowTitle('test0')      


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

    root=ZeroWindowAct()

    zero_widgets_act.ZeroWidgetsAct(root)        #调用要绑定的QWidget模块

    root.show()
    sys.exit(app.exec_())


负责QWidget模块的zero_widgets.py(前台UI)界面:

import sys

from PyQt5 import QtCore, QtGui, QtWidgets

sys.path.append(r'G:\\pythoncodes\\qt5')

class Ui_Dialog(object):
    def setupUi(self):

      self.buttonUI()


    def buttonUI(self):
      self.test_button=QtWidgets.QPushButton(self)
      self.test_button.setGeometry(QtCore.QRect(200,200,200,50))
      self.test_button.setText('test')


负责QWidget模块的zero_widgets_act.py(后台)界面:

import sys
import zero_widgets
import time

from PyQt5 import QtCore,QtGui,QtWidgets
from PIL import Image

sys.path.append(r'G:\\pythoncodes\\qt5')


class ZeroWidgetsAct(zero_widgets.Ui_Dialog,QtWidgets.QWidget):
    def __init__(self,root):
      super(zero_widgets.Ui_Dialog, self).__init__()
      self.root=root

      self.setupUi()

      self.test_button.clicked.connect(self.opn_btn_clicked)

    def opn_btn_clicked(self):

        print('yes')

FishC 发表于 2024-7-14 17:29:57

你的问题是如何在前后台分离的两个不同的 `.py` 文件中,将 `QWidget` 绑定到 `QMainWindow` 上,但启动后只显示空白的 `QMainWindow` 界面,没有显示 `QWidget` 的内容。我们来一步步排查并解决这个问题。

### 原因分析

1. `zero_widgets_act.ZeroWidgetsAct(root)` 只是创建了一个 `ZeroWidgetsAct` 的实例,但没有将这个实例添加到 `ZeroWindowAct` 中。
2. `setupUi` 方法中,`buttonUI` 方法需要将按钮添加到合适的父容器中。

### 解决方案

我们需要确保 `ZeroWidgetsAct` 的实例被正确地嵌入到 `QMainWindow` 中。修改 `zero_wind_act.py` 和 `zero_widgets_act.py` 文件。

### 修改 `zero_wind_act.py`

在 `zero_wind_act.py` 中,我们需要将 `ZeroWidgetsAct` 实例添加为 `ZeroWindowAct` 的中央窗口小部件(central widget)。

import sys
import zero_widgets_act

from PyQt5 import QtCore, QtGui, QtWidgets
from PIL import Image

sys.path.append(r'G:\\pythoncodes\\qt5')

class ZeroWindowAct(QtWidgets.QMainWindow):
    def __init__(self):
      super(ZeroWindowAct, self).__init__()
      self.setupWidget()

    def setupWidget(self):
      self.resize(1080, 720)
      self.setWindowTitle('test0')
      self.widget = zero_widgets_act.ZeroWidgetsAct(self)
      self.setCentralWidget(self.widget)# 设置中央窗口小部件

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

### 修改 `zero_widgets_act.py`

确保 `ZeroWidgetsAct` 的实例是一个独立的 `QWidget` 并且其子控件(按钮等)被正确初始化。

import sys
import zero_widgets
import time

from PyQt5 import QtCore, QtGui, QtWidgets
from PIL import Image

sys.path.append(r'G:\\pythoncodes\\qt5')

class ZeroWidgetsAct(zero_widgets.Ui_Dialog, QtWidgets.QWidget):
    def __init__(self, root=None):
      super(ZeroWidgetsAct, self).__init__(root)# 注意这里传递 root
      self.setupUi(self)# 传递 self 以便设置 UI

      self.test_button.clicked.connect(self.opn_btn_clicked)

    def opn_btn_clicked(self):
      print('yes')

class Ui_Dialog(object):
    def setupUi(self, Dialog):
      Dialog.setObjectName("Dialog")
      Dialog.resize(400, 300)
      self.buttonUI(Dialog)

    def buttonUI(self, Dialog):
      self.test_button = QtWidgets.QPushButton(Dialog)
      self.test_button.setGeometry(QtCore.QRect(200, 200, 200, 50))
      self.test_button.setText('test')

### 总结

- 在 `zero_wind_act.py` 中,将 `ZeroWidgetsAct` 实例设置为 `QMainWindow` 的中央小部件。
- 确保在 `zero_widgets_act.py` 中,`ZeroWidgetsAct` 的 UI 元素被正确初始化,并且其父容器被正确传递。

按照上述修改后,启动 `zero_wind_act.py` 应该能看到带有按钮的 `QMainWindow` 界面。如果还有其他问题,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: [pyqt5]如何在前后台分离,且两个不同的.py中,将QWidget绑定到QMainWindow上