Подтвердить что ты не робот

Python: всплывающее окно PyQt

Итак, я создаю свой графический интерфейс с Qt для моего приложения Python. Теперь я пришел к ситуации, когда после нажатия кнопки выполняется соответствующее отложенное выполнение, мы выполняем некоторые задачи, тогда мне нужно открыть отдельное окно, содержащее одну или две вещи. Но я не могу понять, как создать это новое отдельное окно. Может ли кто-нибудь дать мне пример того, как его создать?

4b9b3361

Ответ 1

Общей ошибкой, которая может свести вас с ума, является забывание сохранить дескриптор всплывающего окна, которое вы создаете в некоторой переменной python, которая останется в живых (например, в элементе данных в главном окне).

Ниже приведена простая программа, которая создает главное окно с кнопкой, при нажатии которой открывается всплывающее окно

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import sys
from PyQt4.Qt import *

class MyPopup(QWidget):
    def __init__(self):
        QWidget.__init__(self)

    def paintEvent(self, e):
        dc = QPainter(self)
        dc.drawLine(0, 0, 100, 100)
        dc.drawLine(100, 0, 0, 100)

class MainWindow(QMainWindow):
    def __init__(self, *args):
        QMainWindow.__init__(self, *args)
        self.cw = QWidget(self)
        self.setCentralWidget(self.cw)
        self.btn1 = QPushButton("Click me", self.cw)
        self.btn1.setGeometry(QRect(0, 0, 100, 30))
        self.connect(self.btn1, SIGNAL("clicked()"), self.doit)
        self.w = None

    def doit(self):
        print "Opening a new popup window..."
        self.w = MyPopup()
        self.w.setGeometry(QRect(100, 100, 400, 200))
        self.w.show()

class App(QApplication):
    def __init__(self, *args):
        QApplication.__init__(self, *args)
        self.main = MainWindow()
        self.connect(self, SIGNAL("lastWindowClosed()"), self.byebye )
        self.main.show()

    def byebye( self ):
        self.exit(0)

def main(args):
    global app
    app = App(args)
    app.exec_()

if __name__ == "__main__":
    main(sys.argv)

То, что, по моему мнению, может удивить пользователей Python, и может быть проблема, с которой вы сталкиваетесь, заключается в том, что если вы не храните ссылку на новый виджет в основном, например, используя w = MyPopup(...) вместо self.w = MyPopup(...), окно, по-видимому, не появляется (фактически оно создано и сразу же уничтожено).

Причина в том, что, когда локальная переменная w выходит за пределы области видимости, поскольку никто не ссылается на виджет, который виджет удаляется. Это можно увидеть четко, потому что, если вы снова нажмете кнопку, вы увидите, что при появлении второго всплывающего окна первое закрывается.

Это также означает, что если вам нужно создать несколько всплывающих окон, которые вы, например, можете поместить в список python, и вы должны удалить их из этого списка, как только всплывающие окна будут закрыты пользователем. Эквивалент в примере может быть изменен на self.w = [] в конструкторе, а затем выполняется self.w.append(MyPopup(...)). Это позволит вам открыть несколько всплывающих окон.

Ответ 2

Как правило, вы просто показываете несколько окон без родителя с someQWidget.show(), например:

w1 = QLabel("Window 1")
w2 = QLabel("Window 2")
w1.show()
w2.show()

Но, скорее всего, вам нужен модальный стандартный диалог, например this. Также не забудьте понять модальные диалоги.