Я второй FlashDevelop. Вы не получаете материал визуального проектирования для MXML, но для кода (и MXML и AS), это превосходно.
Распространенная ошибка, которая может свести вас с ума, - забыть сохранить дескриптор всплывающего окна, которое вы создаете, в некоторой переменной 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(...))
. Это позволит вам открыть несколько всплывающих окон.
Как правило, вы просто показываете несколько окон без родителей с someQWidget.show()
, например:
w1 = QLabel("Window 1")
w2 = QLabel("Window 2")
w1.show()
w2.show()
Но, скорее всего, вам нужен модальный стандартный диалог, такой как this . Также убедитесь, что понимаете модальные диалоги .