【问题标题】:Calling QMainWindow From Second QDialog从第二个 QDialog 调用 QMainWindow
【发布时间】:2015-10-18 02:30:42
【问题描述】:

我的 PyQt 应用程序从登录屏幕开始。如果密码 OK,则会出现一个模块屏幕(带有图标)。当用户单击某个按钮时,将出现一个 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()

我做错了什么?谢谢。

【问题讨论】:

    标签: python qt pyqt pyqt4


    【解决方案1】:

    最近我做了类似的工作:我有一个日志窗口和一个主窗口,我使用类似 FSM 的东西在日志和主窗口之间切换。 假设我们有 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()
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-11-24
        • 1970-01-01
        • 1970-01-01
        • 2018-02-25
        • 1970-01-01
        • 1970-01-01
        • 2019-06-24
        • 1970-01-01
        • 2014-04-08
        相关资源
        最近更新 更多