2012-01-31 2 views
2

Мне нужно знать, как можно сделать всплывающее диалоговое окно, когда пользователь нажимает кнопку.Отображение всплывающих окон в Python (PyQt4)

Я относительно новичок и для Python, и для PyQt/QtDesigner. Я использую их только около месяца, но я думаю, что у меня есть хорошее понимание.

Вот что у меня есть: Главное диалоговое окно (которое является основной частью приложения), которое я разработал в QtDesigner. Я преобразовал .ui в .py, используя pyuic4easy.

Вот что я хочу сделать: создать новое диалоговое окно в QtDesigner и как-то заставить его всплывать, когда пользователь нажимает кнопку в первом (основном) диалоговом окне.

Вот код для моего основного диалога:

import sys 
from PyQt4.QtCore import * 
from loginScreen import * 


class MyForm(QtGui.QDialog): 

    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.ui = Ui_Dialog() 
     self.ui.setupUi(self) 
     QtCore.QObject.connect(self.ui.pushButton, QtCore.SIGNAL('clicked()'), self.popup)  
     ... 

     ... Some functions ... 

    def popup(self): 
     #Pop-up the new dialog 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    myapp= MyForm() 
    myapp.show() 
    sys.exit(app.exec_()) 

Так как вы можете видеть, я подключил первую кнопку метода под названием «всплывающее окно», которое должно быть заполнено с кодом, чтобы сделать мое второе окно всплывает. Как мне это сделать? Помните, что я уже разработал свое второе диалоговое окно в QtDesigner, и мне не нужно создавать новый.

Спасибо за помощь!

ответ

8

Так как вы можете видеть, я подключил первую кнопку для метода с именем «всплывающего», которая должна быть заполнена с кодом, чтобы сделать свой второй всплывающее окно. Как мне это сделать?

Практически так же, как вы это делаете для своего главного окна (MyForm).

Как обычно, вы пишете класс оболочки для своего кода QtDesigner для второго диалога (например, с MyForm). Назовем это MyPopupDialog. Затем в вашем методе popup вы создаете экземпляр, а затем показываете свой экземпляр либо exec_(), либо show() в зависимости от того, хотите ли вы модальное или немодальное диалоговое окно. (Если вы не знакомы с модальными/безрежимными концепциями, вы можете обратиться к documentation.)

Так общая вещь может выглядеть следующим образом (с несколькими изменениями):

# Necessary imports 

class MyPopupDialog(QtGui.QDialog): 
    def __init__(self, parent=None): 
     # Regular init stuff... 
     # and other things you might want 


class MyForm(QtGui.QDialog): 
    def __init__(self, parent=None): 
     # Here, you should call the inherited class' init, which is QDialog 
     QtGui.QDialog.__init__(self, parent) 

     # Usual setup stuff 
     self.ui = Ui_Dialog() 
     self.ui.setupUi(self) 

     # Use new style signal/slots 
     self.ui.pushButton.clicked.connect(self.popup)  

     # Other things... 

    def popup(self): 
     self.dialog = MyPopupDialog() 

     # For Modal dialogs 
     self.dialog.exec_() 

     # Or for modeless dialogs 
     # self.dialog.show() 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    myapp= MyForm() 
    myapp.show() 
    sys.exit(app.exec_()) 
+0

Вы забыли держать когда вы показываете() 'диалог. – ekhumoro

+0

Ах, право. Исправлена. Спасибо – Avaris

+0

Спасибо Avaris! Мне удалось создать всплывающее окно, но оно имеет то же содержимое, что и диалоговое окно, которое появилось. Как это исправить? Кроме того, могу ли я создать недавно всплывающее окно в PyQt, а вместо этого включить мой код? Это то, что мой код выглядит следующим образом, для нового диалога: класс 'MyPopUp (QtGui.QDialog): Защиту __init __ (я, родитель = None): QtGui.QDialog .__ INIT __ (я, родитель) самостоятельно. ui = Ui_Dialog() self.ui.setupUi (self) ' – user1179452