从第二个QDialog调用QMainWindow

时间:2015-07-27 18:50:58

标签: python qt pyqt pyqt4

我的PyQt应用程序从登录屏幕开始。如果密码正常,则会出现模块屏幕(带图标)。当用户单击某个按钮时,将出现QMainWindow。但我无法做到这一点,因为 qmainwindow对象没有属性' _exec' 错误。这是我的代码:

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()

我做错了什么?谢谢。

2 个答案:

答案 0 :(得分:1)

最近我做了类似的工作:我有一个登录窗口和一个主窗口,我使用类似FMS的东西在登录和主窗口之间切换。 让我们说我们有3个状态:loging,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()

答案 1 :(得分:0)

除了应用程序对象和QDrag之外,请假装exec()不存在。这是一种完全混乱的方法,基本上不必使用。 特别是不是Qt的新手。

如果您想显示任何小部件,只需show()即可。如果您希望在接受对话框时收到通知,请将一些代码连接到其accepted()信号。就是这样。