当次要 Window 关闭时刷新主要 Window PyQt5
Refresh Main Window When Secondary Window Is Closed PyQt5
在 PyQt5 中,我有一个 window 从数据库读取信息并将该信息添加到小部件。还有第二个 window,打开后会向数据库添加一个新的 table。我想要做的是在次 window 关闭时重新加载主 window。我不想将辅助 window 更改为 QDialoge
,需要使用 .show()
,而不是 .exec_()
。有什么办法可以做到这一点。
有我的代码:
import sys
import sqlite3
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QPushButton, QListWidget, QVBoxLayout, QWidget
from PyQt5.QtCore import Qt
class SecondWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(SecondWindow, self).__init__(*args, **kwargs)
self.setWindowTitle("App 2")
label = QLabel("INSERTED VALUES")
label.setAlignment(Qt.AlignCenter)
self.setCentralWidget(label)
#Open Database
self.conn = sqlite3.connect("connections.db")
self.cursor = self.conn.cursor()
#Add New Table To Database
self.cursor.execute('''CREATE TABLE `New`
(name text, GD text)''')
self.conn.commit()
self.conn.close()
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setWindowTitle("App")
self.list = QListWidget()
self.cursorCount = 0
#Open Database
self.conn = sqlite3.connect("connections.db")
self.cursor = self.conn.cursor()
try:
#Try To Create A Table If It Doesn't exit
self.cursor.execute('''CREATE TABLE `Default`
(name text, GD text)''')
except:
pass
#Get A List Of All The Tables
self.cursor.execute('SELECT name FROM sqlite_master WHERE type= "table"')
for table in self.cursor.fetchall():
self.list.insertItem(self.cursorCount, table[0])
self.cursorCount += 1
self.conn.commit()
self.conn.close()
self.list.item(0).setSelected(True)
self.btn = QPushButton()
self.btn.setText("click me!")
self.btn.clicked.connect(self.openWin)
winWidget = QWidget()
self.setCentralWidget(winWidget)
layout = QVBoxLayout()
layout.addWidget(self.list)
layout.addWidget(self.btn)
winWidget.setLayout(layout)
def openWin(self):
self.win = SecondWindow()
self.win.show()
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
如有任何帮助,我们将不胜感激
我不确定我是否正确解决了您的问题,但我认为您可以使用来自 PyQt5 的信号和 closeEvent 方法。基本上,您应该在第二个 window 中创建一个信号,该信号将在关闭事件发生时发出,并将该信号连接到第一个 window.
中的插槽
导入:
from PyQt5.QtCore import pyqtSignal
在声明第二个 window class 时,在 init 之前,声明你的信号:
class SecondWindow(QMainWindow):
window_closed = pyqtSignal()
创建一个名为 closeEvent 的方法,当您关闭 window 时将调用该方法,当它发生时它应该发出您之前声明的信号:
def closeEvent(self, event):
self.window_closed.emit()
event.accept()
# event.ignore() # if you want the window to never be closed
并修改 MainWindow openWin 方法,将第二个 window 的信号连接到您要调用的方法:
def openWin(self):
self.win = SecondWindow()
self.win.window_closed.connect(self.do_something)
self.win.show()
def do_something(self):
print("You closed the second window!")
编辑:
整个代码应该是这样的(我自己去掉了测试相关的parts数据库,貌似没问题)
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QPushButton, QListWidget, QVBoxLayout, QWidget
from PyQt5.QtCore import Qt, pyqtSignal
class SecondWindow(QMainWindow):
window_closed = pyqtSignal()
def __init__(self, *args, **kwargs):
super(SecondWindow, self).__init__(*args, **kwargs)
self.setWindowTitle("App 2")
label = QLabel("INSERTED VALUES")
label.setAlignment(Qt.AlignCenter)
self.setCentralWidget(label)
def closeEvent(self, event):
self.window_closed.emit()
event.accept()
# event.ignore() # if you want the window to never be closed
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setWindowTitle("App")
self.btn = QPushButton()
self.btn.setText("click me!")
self.btn.clicked.connect(self.openWin)
winWidget = QWidget()
self.setCentralWidget(winWidget)
layout = QVBoxLayout()
layout.addWidget(self.btn)
winWidget.setLayout(layout)
def openWin(self):
self.win = SecondWindow()
self.win.window_closed.connect(self.do_something)
self.win.show()
def do_something(self):
print("You closed the second window!")
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
在 PyQt5 中,我有一个 window 从数据库读取信息并将该信息添加到小部件。还有第二个 window,打开后会向数据库添加一个新的 table。我想要做的是在次 window 关闭时重新加载主 window。我不想将辅助 window 更改为 QDialoge
,需要使用 .show()
,而不是 .exec_()
。有什么办法可以做到这一点。
有我的代码:
import sys
import sqlite3
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QPushButton, QListWidget, QVBoxLayout, QWidget
from PyQt5.QtCore import Qt
class SecondWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(SecondWindow, self).__init__(*args, **kwargs)
self.setWindowTitle("App 2")
label = QLabel("INSERTED VALUES")
label.setAlignment(Qt.AlignCenter)
self.setCentralWidget(label)
#Open Database
self.conn = sqlite3.connect("connections.db")
self.cursor = self.conn.cursor()
#Add New Table To Database
self.cursor.execute('''CREATE TABLE `New`
(name text, GD text)''')
self.conn.commit()
self.conn.close()
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setWindowTitle("App")
self.list = QListWidget()
self.cursorCount = 0
#Open Database
self.conn = sqlite3.connect("connections.db")
self.cursor = self.conn.cursor()
try:
#Try To Create A Table If It Doesn't exit
self.cursor.execute('''CREATE TABLE `Default`
(name text, GD text)''')
except:
pass
#Get A List Of All The Tables
self.cursor.execute('SELECT name FROM sqlite_master WHERE type= "table"')
for table in self.cursor.fetchall():
self.list.insertItem(self.cursorCount, table[0])
self.cursorCount += 1
self.conn.commit()
self.conn.close()
self.list.item(0).setSelected(True)
self.btn = QPushButton()
self.btn.setText("click me!")
self.btn.clicked.connect(self.openWin)
winWidget = QWidget()
self.setCentralWidget(winWidget)
layout = QVBoxLayout()
layout.addWidget(self.list)
layout.addWidget(self.btn)
winWidget.setLayout(layout)
def openWin(self):
self.win = SecondWindow()
self.win.show()
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
如有任何帮助,我们将不胜感激
我不确定我是否正确解决了您的问题,但我认为您可以使用来自 PyQt5 的信号和 closeEvent 方法。基本上,您应该在第二个 window 中创建一个信号,该信号将在关闭事件发生时发出,并将该信号连接到第一个 window.
中的插槽导入:
from PyQt5.QtCore import pyqtSignal
在声明第二个 window class 时,在 init 之前,声明你的信号:
class SecondWindow(QMainWindow):
window_closed = pyqtSignal()
创建一个名为 closeEvent 的方法,当您关闭 window 时将调用该方法,当它发生时它应该发出您之前声明的信号:
def closeEvent(self, event):
self.window_closed.emit()
event.accept()
# event.ignore() # if you want the window to never be closed
并修改 MainWindow openWin 方法,将第二个 window 的信号连接到您要调用的方法:
def openWin(self):
self.win = SecondWindow()
self.win.window_closed.connect(self.do_something)
self.win.show()
def do_something(self):
print("You closed the second window!")
编辑:
整个代码应该是这样的(我自己去掉了测试相关的parts数据库,貌似没问题)
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QPushButton, QListWidget, QVBoxLayout, QWidget
from PyQt5.QtCore import Qt, pyqtSignal
class SecondWindow(QMainWindow):
window_closed = pyqtSignal()
def __init__(self, *args, **kwargs):
super(SecondWindow, self).__init__(*args, **kwargs)
self.setWindowTitle("App 2")
label = QLabel("INSERTED VALUES")
label.setAlignment(Qt.AlignCenter)
self.setCentralWidget(label)
def closeEvent(self, event):
self.window_closed.emit()
event.accept()
# event.ignore() # if you want the window to never be closed
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setWindowTitle("App")
self.btn = QPushButton()
self.btn.setText("click me!")
self.btn.clicked.connect(self.openWin)
winWidget = QWidget()
self.setCentralWidget(winWidget)
layout = QVBoxLayout()
layout.addWidget(self.btn)
winWidget.setLayout(layout)
def openWin(self):
self.win = SecondWindow()
self.win.window_closed.connect(self.do_something)
self.win.show()
def do_something(self):
print("You closed the second window!")
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()