【问题标题】:Refresh Main Window When Secondary Window Is Closed PyQt5关闭辅助窗口时刷新主窗口 PyQt5
【发布时间】:2021-01-29 18:39:25
【问题描述】:

在 PyQt5 中,我有一个从数据库读取信息并将该信息添加到小部件的窗口。还有第二个窗口,打开时会向数据库中添加一个新表。我要做的是在关闭辅助窗口时重新加载主窗口。我不想将辅助窗口更改为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_()

任何帮助将不胜感激

【问题讨论】:

  • 为什么你需要使用show()而不是exec_()
  • 上面的代码是简单的程序,做基础。一旦完成。第二个窗口实际上将包含更多功能。因此,以后,我需要它是.show()
  • 然后在辅助窗口中创建一个自定义信号,从主窗口连接它并在需要时发出信号。
  • 我该怎么做。我以前从未使用过信号。

标签: python python-3.x qt pyqt pyqt5


【解决方案1】:

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

导入:

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

编辑:

整个代码应该是这样的(我自己把test相关的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_()

【讨论】:

  • 感谢您的回答,您能否发布所有代码,因为当我运行它时,我收到一条错误消息,提示 SecondWindow has no attribute window_closed
  • 我刚刚编辑了答案以包含它。另外,我建议这个播放列表here。它对我理解 PyQt5 的基础知识有很大帮助。
猜你喜欢
  • 2023-01-24
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 2011-05-15
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多