2015-07-27 3 views
0

Приложение My PyQt начинается с экрана входа в систему. Если пароль OK, появится экран модуля (с значками). Когда пользователь нажмет кнопку, появится QMainWindow. Но я не могу этого сделать из-за . Объект qmainwindow не имеет атрибута '_exec' Ошибка. Это мой код:Вызов QMainWindow из второго QDialog

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

class Main(QMainWindow): 
    def __init__(self, parent=None): 
     super(Main, self).__init__(parent) 
     ... 
     ... 

class Login(QDialog): 
    def __init__(self, parent=None): 
     super(Login, self).__init__(parent) 
     ... 
     ... 

uyg=QApplication(sys.argv) 

class icons(QDialog): 
    def __init__(self, parent=None): 
     super(icons, self).__init__(parent) 
     ... 
     self.buton = QPushButton() 
     self.buton.pressed.connect(self.open) 
     ... 
    def open(self): 
     dialogmain = Main() 
     dialogmain._exec() #or dialogmain.show() ??? 
     self.accept() 
     self.close() 
     uyg.exec_()  

if Login().exec_() == QDialog.Accepted: 
    dialog = icons() 
    dialog.exec_() 
else: 
    uyg.quit() 

Что я делаю неправильно? Спасибо.

ответ

1

В последнее время я сделал аналогичную работу: у меня есть окно регистрации и главное окно, и я использовал что-то вроде FMS для переключения между логином и основным окном. Предположим, у нас есть 3 состояния: логирование, main, quit.

STATE_LOGING = 0 
STATE_MAIN = 1 
STATE_QUIT = 2 
STATE_DESTROY = 3 #this is a flag 

class CState(): 
    sigSwitchState = pyqtSignal(int) 
    def __init__(self): 
     super(CState,self).__init__() 

    def start(self): 
     pass 

    def sendQuit(self,nextstate): 
     self.sigSwitch.emit(nextstate) 

class CLoginState(CState): 
    def __init__(self): 
     super(CLoginState,self).__init__() 

    def start(self): 
     w = Loging() 
     w.show() 

    def whenPasswdOk(self): 
     self.sendQuit(STATE_MAIN) 

class CMainState(CState): 
    def __init__(self): 
     super(CMainState,self).__init__() 

    def start(self): 
     w = MainWindow() 
     w.show() 

    def whenMainWindowQuit(self): 
     self.sendQuit(STATE_QUIT) 

class CQuitState(CState): 
    def __init__(self): 
     super(CQuitState,self).__init__() 

    def start(self): 
     #do some clean stuff... 
     pass 
    def whenCleanDone(self): 
     self.sendQuit(STATE_DESTROY) 

class CMainApp(): 
    def __init__(self): 
     self.app = QApplication(sys.argv) 

    def __CreateState(state): 
     if state == STATE_LOGING: 
      s = CLoginState() 
     if state == STATE_MAIN: 
      s = CMainState() 
     #... same as other state 
     s.sigSwitchState.connect(self.procNextState) 

    def procNextState(self,state): 
     if state == STATE_DESTROY: 
      QApplication().exit() 

     s = self.__CreateState(state) 
     s.start() 

    def run(self): 
     self.procNextState(STATE_LOGING) 
     sys.exit(self.app.exec_()) 

if __name__ == "__main__": 
    app = CMainApp() 
    app.run() 
0

Помимо объекта приложения и QDrag, пожалуйста, притворитесь, что exec() не существует. Это совершенно путающий метод, который по существу никогда не должен использоваться. В частности не кем-либо новым для Qt.

Если вы хотите отобразить виджет, просто show(). Если вы хотите получать уведомления, когда был принят диалог, подключите некоторый код к его сигналу accepted(). Это все.

Смежные вопросы