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

Я второй FlashDevelop. Вы не получаете материал визуального проектирования для MXML, но для кода (и MXML и AS), это превосходно.

22
задан Morphine 19 January 2013 в 10:12
поделиться

2 ответа

Распространенная ошибка, которая может свести вас с ума, - забыть сохранить дескриптор всплывающего окна, которое вы создаете, в некоторой переменной 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(...)). Это позволит вам открыть несколько всплывающих окон.

45
ответ дан 29 November 2019 в 04:19
поделиться

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

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

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

3
ответ дан 29 November 2019 в 04:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: