Id想问如何连接2个不同的类。我在2个类中有以下代码(2个类,因为我创建了2个不同的接口。1个是QMainwindow,另一个1个是QWidget)。
代码如下:
class MainWindow(QMainWindow, Ui_MainWindow):
def open_inv_search_form(self):
self.window = QtWidgets.QWidget()
self.ui = Ui_Inv_Search()
self.ui.setupUi(self.window)
self.window.show()
MainWindow.setEnabled(False)
class Inv_Search(QWidget, Ui_Inv_Search):
def __init__(self,):
super(Inv_Search, self).__init__()
self.btn_close_search.clicked.connect(self.close_inv_search_form)
def close_inv_search_form(self):
Inv_Search.hide()
MainWindow.setEnabled(True)
想法是当在MainWindow中单击SEARCH按钮时,将弹出Inv_Search,而MainWindow将被禁用。我已经正确完成了这一部分。单击“关闭”按钮时,将隐藏Inv_Search并启用MainWindow。但是,单击“关闭”按钮时,没有任何反应。而且完全没有错误。
更新
我能够成功完成自己想做的事情。这是我所做的更改。让我知道这是好的还是更好的。尽管如此,此代码仍然有效。
class MainWindow(QMainWindow, Ui_MainWindow):
Inv_Search.show() #called to connect to the new window. This is the key since what i previously did only call the ui, but not connect it to the class itself.
MainWindow.setEnabled(False)
class Inv_Search(QWidget, Ui_Inv_Search):
def __init__(self,):
super(Inv_Search, self).__init__()
self.setupUi(self)
self.btn_close_search.clicked.connect(self.close_inv_search_form)
def close_inv_search_form(self):
Inv_Search.close() # I cant figure out how can I use the self but this works fine
MainWindow.setEnabled(True)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
MainWindow = MainWindow()
Inv_Search = Inv_Search() #added this one
#ui = Ui_MainWindow()
#ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
答案 0 :(得分:0)
我假设某个地方有更多代码和.ui文件。看起来像这行
Inv_Search.hide()
应更改为
self.hide()
此外,我认为这是因为您需要在实例而不是类上调用方法。
self.ui = Ui_Inv_Search()
应该是
self.ui = Inv_Search()
您正在使用MainWindow
做类似的事情。这有点困难,因为您将需要将MainWindow
的实例存储在可访问的位置。尽管您可以通过QtWidget.parentWidget
访问MainWindow
实例,但是在Python中,我更喜欢将实例传递给构造函数。所以
def __init__(self, mainWindow):
self.mainWindow = mainWindow
# ... all the other stuff too
作为您的Inv_Search
构造函数,以及
self.ui = Inv_Search(self)
# notice the new ^ argument
在您的MainWindow
构造函数中。然后
self.mainWindow.setEnabled(True)
在您的课堂方法中。另外,您的参数签名对于clicked
信号是错误的。使用
def close_inv_search_form(self, checked=None):
# Need this ^ argument, even if you don't use it.
实际上,您似乎想要完成的功能最适合于模态对话框,例如QDialog
提供的模态对话框,它将自然处理我想寻找的许多效果。
答案 1 :(得分:0)
在Inv_Search.hide()
中调用MainWindow.setEnabled(True)
和close_inv_search_form
时,您实际上是在类上而不是在实例上调用方法。
from PyQt5.QtCore import qApp
class MainWindow(QMainWindow, Ui_MainWindow):
def open_inv_search_form(self):
self.window = QtWidgets.QWidget()
self.window.ui = Ui_Inv_Search() # You have to set the attributes of the
self.window.ui.setupUi(self.window) # "window" not the instance of MainWindow
self.window.show()
self.setEnabled(False)
class Inv_Search(QWidget, Ui_Inv_Search):
def __init__(self,):
super(Inv_Search, self).__init__()
self.btn_close_search.clicked.connect(self.close_inv_search_form)
def close_inv_search_form(self):
self.hide() # Use the method "hide" on the instance
qApp.setEnabled(True) # Use the method "setEnabled" on the instance
if __name__ == "__main__" :
app = QApplication()
main = MainWindow() # This is the instance that can be referred to by qApp
main.exec_()