【发布时间】:2018-03-03 20:57:34
【问题描述】:
我有一个主 GUI,上面有按钮。在不同的 .py 文件中还有一个子 GUI,上面有一个表格和按钮。我已经将子 GUI 导入到主 GUI,所以现在我可以通过按下按钮来显示子 GUI。但是,我不知道如何从子 GUI 获取值到主 GUI。据我了解,它是关于信号和插槽的,但问题是 GUI 不在同一个 .py 文件中,所以每次都会出错。以下是我正在尝试做的事情:
Sub
....
....
def buttonPressed(self):
self.value = self.table.selectedItems()[1].text()
Main.lineEdit.setText(self.value)
好的,这里是问题的更新版本,包含更多项目代码。
#Main.py
...
from Sub import SubUI
....
class Main(QtGui.QMainWindow, window.Ui_MainWindow):
def __init__(self):
super(self.__class__, self).__init__()
self.setupUi(self)
self.pushButtonShow.clicked.connect(self.ShowSub)
def ShowSub(self):
self.s = Show(self)
self.s.show()
.....
...
class Show(QtGui.QMainWindow, SubUI):#class to show SubUI
def __init__(self, parent = None):
super(Show, self).__init__(parent)
self.setupUi(self)
#Sub.py
class SubUI(QtGui.QWidget):
def __init__(self, main):
super(SubUI, self).__init__()
#self.setupUi(self)
self.Main = main
self.pushButtonOk.clicked.connect(self.Run)
.....
....
def Run(self):
self.value = self.table.selectedItems()[1].text()
self.Main.lineEdit.setText(self.value)
这是错误信息;
File "C:...\Sub.py", line 120, in secc
self.Main.lineEdit.setText(self.value)
AttributeError: 'Show' object has no attribute 'Main'
希望现在更清楚了。谢谢!
在 Main.py 中进行更改的解决方案将是这样的;
#Main.py
...
from Sub import SubUI
....
class Main(QtGui.QMainWindow, window.Ui_MainWindow):
def __init__(self):
super(self.__class__, self).__init__()
self.setupUi(self)
self.pushButtonShow.clicked.connect(self.ShowSub)
def ShowSub(self):
self.s = SubUI(self)
self.s.show()
【问题讨论】:
-
您可以展示如何创建 SubUI 类的对象。
-
这条指令没有意义,为什么要继承2个widget?
class Show(QtGui.QMainWindow, SubUI) -
这是我的 SubUI 通过单击 main.py 按钮显示的方式。如果您有解决方案,请添加您的解决方案。谢谢!
-
您是否有理由需要创建 Show 类?它似乎只是从您的 SubUI 类继承而来,没有任何功能。相反,在 Main 类 ShowSub 函数中,您可以执行
self.s = SubUI(self)后跟self.s.show() -
你完全正确!当我尝试您的方法时,我得到“'SubUI' 对象没有属性'setCentralWidget'”,并且我的 SubUI 显示为空白窗口。现在,我已经将我的类 SubUI(QtGui.QWidget) 更改为 -> SubUI(QtGui.QMainWindow),现在它工作得非常完美!感谢您的耐心和友好的帮助!也许在您对 SubUI(QtGui.QMainWindow) 的回答中更改您的类定义以使其更具包容性会更好。
标签: python class user-interface pyside