从第二个 QDialog 调用 QMainWindow

Calling QMainWindow From Second QDialog

我的 PyQt 应用程序以登录屏幕启动。如果密码正确,将出现一个模块屏幕(带有图标)。当用户点击某个按钮时,会出现一个 QMainWindow。但我不能这样做,因为 qmainwindow object has no attribute '_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()

我做错了什么?谢谢。

除了应用对象和QDrag,请假装exec()不存在。这是一种完全令人困惑的方法,基本上永远不必使用。 尤其是 Qt 新手。

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

最近我做了类似的 work:I 有一个日志 window 和一个主 window ,我使用类似 FSM 的东西在日志和主 [=15] 之间切换=]. 假设我们有 3 state: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()