如何在PyQT5的每个循环中显示新的QMainWindow?

问题描述 投票:-1回答:1

我正在尝试使用PyQt5编写Python程序,该程序将在for循环的每次迭代中显示一个窗口。我想在增加并显示下一个窗口后关闭。但是,我不知道如何在每次迭代时都停止循环,目前我一次获得6个窗口。

main.py

import sys
from PyQt5.QtWidgets import (QLineEdit, QVBoxLayout, QMainWindow, 
    QWidget, QDesktopWidget, QApplication, QPushButton, QLabel, 
    QComboBox, QFileDialog, QRadioButton)
from PyQt5.QtCore import pyqtSlot, QByteArray
from alert import Window2
from test import test

class SG(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.resize(300, 150)
        self.setWindowTitle('TEST')

        self.resultsGen = QPushButton('TEST', self)
        self.resultsGen.clicked.connect(lambda: self.on_click())

        self.show()

    @pyqtSlot()
    def on_click(self):
        test(self)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    sg = SG()

    sys.exit(app.exec_())

alert.py

from PyQt5.QtWidgets import (QLineEdit, QVBoxLayout, QMainWindow, 
    QWidget, QDesktopWidget, QApplication, QPushButton, QLabel, 
    QComboBox, QFileDialog, QRadioButton)
from PyQt5.QtCore import pyqtSlot, QByteArray
from PyQt5.QtGui import QPixmap

from PyQt5 import QtGui, QtCore

class Window2(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initPopup()

    def initPopup(self):
        self.resize(500, 500)
        self.setWindowTitle("Window22222")
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        lay = QVBoxLayout(self.central_widget)

        label = QLabel(self)
        pixmap = QPixmap('cropped/8.png')
        label.setPixmap(pixmap)
        self.resize(pixmap.width(), pixmap.height())

        lay.addWidget(label)

        self.textbox = QLineEdit(self)
        self.textbox.move(20, 20)
        self.textbox.resize(280, 40)

        # Create a button in the window
        self.button = QPushButton('Show text', self)
        self.button.move(20, 80)
        # connect button to function on_click
        self.button.clicked.connect(lambda: self.on_clickX())
        self.show()

    @pyqtSlot()
    def on_clickX(self):
        textboxValue = self.textbox.text()
        print(textboxValue)
        self.textbox.setText("")
        self.hide()

test.py

from alert import Window2

def test(self):
    for x in range(6):
        w = Window2()
python pyqt
1个回答
0
投票

一旦运行for循环,将执行所有初始化代码,其中包括您在show()末尾使用的initPopup()调用。

一种简单的解决方案是创建一个新信号,该信号在您隐藏窗口时发出,并将该信号连接到一个函数,该函数创建一个新信号,直到达到最大数量为止。

main.py:

import sys
from PyQt5.QtWidgets import QWidget, QApplication, QPushButton
from alert import Window2

class SG(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.alerts = []

    def initUI(self):
        self.resize(300, 150)
        self.setWindowTitle('TEST')

        self.resultsGen = QPushButton('TEST', self)
        self.resultsGen.clicked.connect(self.nextAlert)

        self.show()

    def nextAlert(self):
        if len(self.alerts) >= 6:
            return
        alert = Window2()
        self.alerts.append(alert)
        alert.setWindowTitle('Window {}'.format(len(self.alerts)))
        alert.closed.connect(self.nextAlert)
        alert.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    sg = SG()

    sys.exit(app.exec_())

alert.py:

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class Window2(QMainWindow):
    closed = pyqtSignal()
    def __init__(self):
        super().__init__()
        self.initPopup()

    def initPopup(self):
        self.resize(500, 500)
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        lay = QVBoxLayout(self.central_widget)

        label = QLabel(self)
        pixmap = QPixmap('cropped/8.png')
        label.setPixmap(pixmap)
        self.resize(pixmap.width(), pixmap.height())

        lay.addWidget(label)

        self.textbox = QLineEdit(self)
        lay.addWidget(self.textbox)

        # Create a button in the window
        self.button = QPushButton('Show text', self)
        lay.addWidget(self.button)
        # connect button to function on_click
        self.button.clicked.connect(lambda: self.on_clickX())
        self.show()

    @pyqtSlot()
    def on_clickX(self):
        textboxValue = self.textbox.text()
        print(textboxValue)
        self.textbox.setText("")
        self.hide()
        self.closed.emit()

只需注意,在这个非常简化的示例中,即使可以看到“警报”窗口,用户也可以单击“ SG”小部件的按钮。您可能更喜欢使用QDialog而不是QMainWindow并使主窗口小部件成为该对话框的parent

main.py:

class SG(QWidget):
    # ...
    def nextAlert(self):
        if len(self.alerts) >= 6:
            return
        alert = Window2(self)
        # ...

alert.py:

class Window2(QDialog):
    closed = pyqtSignal()
    def __init__(self, parent):
        super().__init__()
        self.initPopup()

    def initPopup(self):
        self.resize(500, 500)
        # a QDialog doesn't need a central widget
        lay = QVBoxLayout(self)
        # ...

此外,如果使用“ X”按钮关闭了警报窗口,则不会自动显示新窗口。为避免这种情况,可以实现“ closeEvent”并忽略该事件,以便用户在单击按钮之前无法关闭窗口。由于QDialogs在按退出键时可以自行关闭,因此我也忽略了这种情况。

alert.py:

class Window2(QMainWindow):
    # ...
    def closeEvent(self, event):
        event.ignore()

    def keyPressEvent(self, event):
        if event.key() != Qt.Key_Escape:
            super().keyPressEvent(event)
© www.soinside.com 2019 - 2024. All rights reserved.