如何连接到pyqt5中的不同类?

时间:2018-07-06 10:44:24

标签: python pyqt pyqt5

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_())  

2 个答案:

答案 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_()