[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')
你的问题是如何在前后台分离的两个不同的 `.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]