Как подключиться к разным классам в pyqt5? - PullRequest
0 голосов
/ 06 июля 2018

Я хотел бы спросить, как соединить 2 разных класса. У меня есть следующие коды в 2 классах (2 класса, потому что я создал 2 различных интерфейса. 1 - QMainwindow, а другой - 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, всплывет Inv_Search, а MainWindow будет отключено. Я сделал эту часть правильно. При нажатии кнопки ЗАКРЫТЬ Inv_Search будет скрыт, и MainWindow будет включен. Однако при нажатии кнопки ЗАКРЫТЬ ничего не произошло. И нет ошибки вообще.

UPDATE

Я смог успешно делать то, что хотел. Вот изменения, которые я сделал. Дайте мне знать, если это хорошо или может быть лучше. Тем не менее, этот код работает.

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 голосов
/ 06 июля 2018

Когда вы вызываете 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_()
0 голосов
/ 06 июля 2018

Я предполагаю, что где-то еще есть код и файл .ui. Похоже на эту строку

Inv_Search.hide()

следует изменить на

self.hide()

Кроме того, я думаю, потому что вам нужно вызывать метод в экземпляре, а не в классе.

self.ui = Ui_Inv_Search()

должно быть

self.ui = Inv_Search()

Вы делаете то же самое с MainWindow. Здесь немного сложнее, потому что вам нужно будет хранить экземпляр MainWindow в доступном месте. Хотя вы можете получить доступ к экземпляру MainWindow через QtWidget.parentWidget, в 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, который будет изначально обрабатывать многие эффекты, которые вы считаете ищем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...