繁体   English   中英

PyQt5 从另一个访问 MainWindow Window

[英]PyQt5 Access MainWindow from Another Window

我是新手,在那个项目中我陷入了困境。 如何从另一个 Window 访问MainWindow class 中的函数。

例如,我需要在Main.list_refresh时访问Child_EditAccount.btn_EDIT_ACCOUNT_3.clicked 我尝试了信号和插槽之类的东西,但没有用。 我用 pyQt Designer 制作了 3 个不同的 Window,我需要将这三个链接在一起。

新.py

# Designs
from design import Ui_MainWindow
from design_addAccount import Ui_MainWindow_Add
from design_editAccount import Ui_MainWindow_Edit

# Modules
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import pyqtSignal, pyqtSlot
import sqlite3

con = sqlite3.connect('shorts.sqlite3')
cur = con.cursor()

class Main(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(Main, self).__init__()

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        

        self.account_process = AccountProcess()
        self.ui.lst_accounts.itemClicked.connect(self.account_process.edit_account)
        
        self.ui.btn_delete_account.clicked.connect(self.account_process.delete_account)
        self.ui.btn_edit_account.clicked.connect(self.account_process.edit_account)
        self.ui.btn_add_account.clicked.connect(self.account_process.add_account)
        self.ui.btn_refresh.clicked.connect(self.list_refresh)
        
        
        self.refresh_trigger = Child_EditAccount()
        self.refresh_trigger.buttonClicked.connect(self.list_refresh)
        
    def list_refresh(self):
        self.ui.lst_accounts.clear()
        for row in cur.execute("SELECT * FROM users"):
            self.ui.lst_accounts.addItem('%s' % (str(row[3])))
    

class Child_AddAccount(QtWidgets.QMainWindow,Ui_MainWindow_Add):
    def __init__(self, parent=None):
        super(Child_AddAccount, self).__init__()

        self.ui = Ui_MainWindow_Add()
        self.ui.setupUi(self)
    
class Child_EditAccount(QtWidgets.QMainWindow,Ui_MainWindow_Edit):
    buttonClicked = pyqtSignal()
    
    def __init__(self, parent=None):
        super(Child_EditAccount, self).__init__()

        self.ui = Ui_MainWindow_Edit()
        self.ui.setupUi(self)
    
    
    def edit_infos(self, username, password, nickname, id):
        self.id = id
        self.ui.txtBox_username_3.insert(username)
        self.ui.txtBox_password_3.insert(password)
        self.ui.txtBox_nickname_3.insert(nickname)
        self.ui.btn_EDIT_ACCOUNT_3.clicked.connect(self.update_by_id)

    
    def update_by_id(self):
        cur.execute('UPDATE users SET username="%s", password="%s", nickname="%s" WHERE id=%s' % (self.ui.txtBox_username_3.text(), self.ui.txtBox_password_3.text(), self.ui.txtBox_nickname_3.text(), self.id))
        con.commit()
                
        self.buttonClicked.emit()
    
        
      
class AccountProcess(QtCore.QObject):
    def add_account(self):
        self.child_add = Child_AddAccount()
        self.child_add.show()
        print('Pressed edit button')

    def delete_account(self):
        print('Pressed delete button')
    
    def edit_account(self, item):
        self.child_edit = Child_EditAccount()
        for i in cur.execute(f"SELECT * FROM users WHERE nickname=\"{item.text()}\";"):
            self.child_edit.edit_infos(str(i[1]), str(i[2]), str(i[3]), str(i[0]))
        self.child_edit.show()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    main = Main()
    main.show()
    sys.exit(app.exec_())

你可以使用pyqtSignal来做你想做的事。 Child_EditAccount class 添加一个pyqtsignal

class Child_EditAccount(QtWidgets.QMainWindow,Ui_MainWindow_Add):
    buttonClicked = pyqtSignal()
    def __init__(self, parent=None):
 

__init__之前,然后当你需要触发 function 使用

buttonClicked.emit()

在 function 中,该按钮用于Child_EditAccount class

然后在主 window 中,您可以通过pyqtsignal创建到 function 的连接

self.Child_EditAccount.buttonClicked.connect(self.myfunction)

在主要 class 的__init__中。其中self.Child_EditAccount是您的Child_EditAccount class 的实例, self.function是您要触发 Main.list_refresh 的Main.list_refresh

您还可以在创建Ui_MainWindow_Edit https://doc.qt.io/qt-5/designer-connection-mode.html时从 QtDesigner 本身创建信号

小心, Child_EditAccount可能继承自Ui_MainWindow_Add而不是Ui_MainWindow_Edit

____

你还可以做的是直接在主程序中链接按钮的信号,就像这个小例子一样

# Modules
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import pyqtSignal, pyqtSlot

class Main2(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(Main2, self).__init__()
        self.centralWidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralWidget)

        self.but= QtWidgets.QPushButton('tdvfdbt')
        self.l = QtWidgets.QHBoxLayout()
        self.l.addWidget(self.but)
        self.centralWidget.setLayout(self.l) 

class Main(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(Main, self).__init__()
        self.win = Main2()
        self.a = self.win.show()

        self.win.but.clicked.connect(self.myfunction)

    def myfunction(self):
        print('called from sub window')





if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    ex = Main(app)
    ex.setWindowTitle('Model micro GUI')
    # ex.showMaximized()
    ex.show()
    sys.exit(app.exec())

如果您知道Child_EditAccount class 的按钮小部件的名称,您可以通过链接

  self.Child_EditAccount.btn_EDIT_ACCOUNT_3.clicked.connect(self.myfunction)

##______

pystsignal放入AccountProcess class

class AccountProcess(QtCore.QObject):
    buttonClicked = pyqtSignal()
    def add_account(self):
        self.child_add = Child_AddAccount()
        self.child_add.show()
        print('Pressed edit button')

    def delete_account(self):
        print('Pressed delete button')

    def edit_account(self, item):
        self.child_edit = Child_EditAccount()
        for i in cur.execute(f"SELECT * FROM users WHERE nickname=\"{item.text()}\";"):
            self.child_edit.edit_infos(str(i[1]), str(i[2]), str(i[3]), str(i[0]))
        self.child_edit.buttonClicked.connect(self.EmitAgain)
        self.child_edit.show()

    def EmitAgain(self):
        self.buttonClicked.emit()

然后在主 class 中使用

class Main(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(Main, self).__init__()

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.account_process = AccountProcess()
        self.account_process.buttonClicked.connect(self.list_refresh)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM