相关文章推荐
阳光的木耳  ·  QApplication.processEv ...·  1 周前    · 
潇洒的猴子  ·  pyqt5 ...·  2 天前    · 
粗眉毛的电脑桌  ·  XamlReader 類別 ...·  8 月前    · 
害羞的鸵鸟  ·  jQuery的document ...·  9 月前    · 
怕老婆的帽子  ·  Getting the following ...·  1 年前    · 

二级窗口关闭时刷新主窗口 PyQt5

1 人关注

在PyQt5中,我有一个窗口,它从数据库中读取信息并将这些信息添加到一个widget中。还有一个窗口,当它打开时,向数据库添加一个新的表。我想做的是在第二个窗口关闭时重新加载主窗口。我不想把二级窗口改为 QDialoge ,需要使用 .show() ,而不是 .exec_() 。我有什么办法可以做到这一点吗。

There is my code:

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 To Create A Table If It Doesn't exit
            self.cursor.execute('''CREATE TABLE `Default`
                     (name text, GD text)''')
        except:
        #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_()

希望得到任何帮助

4 个评论
为什么要用 show() 而不是 exec_()
上面的代码是程序的概要,做的是基础工作。一旦完成。第二个窗口实际上要包含许多更多的功能。因此,为了以后,我需要它是 .show()
然后在二级窗口中创建一个自定义信号,从主窗口中连接它,并在需要时发射信号。
我怎样才能做到这一点。我以前从未使用过信号。
python
python-3.x
qt
pyqt
pyqt5
user14993843
发布于 2021-01-30
1 个回答
Matheus Lorenci Vian
Matheus Lorenci Vian
发布于 2021-01-30
已采纳
0 人赞同

我不确定我是否理解你的问题,但我认为你可以使用PyQt5的信号和closeEvent方法。基本上,你应该在第二个窗口中创建一个信号,当关闭事件发生时发出,并将这个信号连接到第一个窗口中的一个槽。

import with:

from PyQt5.QtCore import pyqtSignal

在声明第二个窗口类时,在init,宣布你的信号。

class SecondWindow(QMainWindow):
    window_closed = pyqtSignal()

创建一个名为closeEvent的方法,它将在你关闭窗口时被调用,当它发生时,应该发出你之前声明的信号。

def closeEvent(self, event):
    self.window_closed.emit()
    event.accept()
    # event.ignore() # if you want the window to never be closed

并修改MainWindow的openWin方法,将第二个窗口的信号连接到你希望被调用的方法。

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!")

Edit:

整个代码应该是这样的(我自己把与测试有关的部分数据库删除了,似乎工作正常)。

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!")