On Tuesday 08 March 2005 06:55, Andreas Pauley wrote: > Hi all, > > I've started writing an app (point of sale) that needs to first show a > login dialog (and succesfully authenticate a user) before showing the > main window. > > I've managed to do this, but my program fails to exit and return to the > command prompt whenever the authentication failed and the main window > never gets showed. The login window closes, but the command I use to > start the app (python main.py) just hangs until I manually kill the > proccess. > The problem doesn't occur when the program exits after the main window is > shown. > > I'm using QT 3.3.3 with PyQt 3.13. > > Regards, > Andreas > > Here is a summary of my code. > (This can also be downloaded from > http://www.qbcon.com/downloads/python/qualitypos-minimal.tgz (12k)) > > In main.py I do: > qapp = QApplication(sys.argv) > > QObject.connect(qapp,SIGNAL("lastWindowClosed()"),qapp,SLOT("quit()")) > poswindow = QualityPOS() > qapp.setMainWidget(poswindow) > poswindow.login() > qapp.exec_loop() > > In the QualityPOS login() method: > class QualityPOS(QualityPOSBase): > def login(self): > loginwindow = Login(self) > loginwindow.show() > loginwindow.exec_loop() > > The clicked signal of my login form connects to the authenticate() method > in my Login class: > class Login(LoginBase): > def __init__(self, poswindow): > LoginBase.__init__(self) > self.authenticated = False > self.poswindow = poswindow > > def authenticate(self): > username=str(self.lnedUsername.text()) > password=str(self.lnedPassword.text()) > user=User.getUser(username, password) > if user: > self.poswindow.show() > self.authenticated = True > else: > self.authenticated = False > QMessageBox.warning(None, > self.trUtf8("Login Incorrect"), > self.trUtf8("""The user id and password you entered is > incorrect."""), > None, > None, > None, > 0, -1) > return self.authenticated
My guess is you can't do that - QDialog runs its own event loop and expects to pop back out to the main event loop, which doesn't exist until exec_loop() is called. You could look at how Qt had coded QSplashScreen, but my guess is there's no event-loop type behavior there either, so it probably won't help much. The easiest solution would be to make the authentication dialog a separate program and spawn/fork the main program on success, or not on failure. I'd think that would be a more secure solution too. Jim _______________________________________________ PyKDE mailing list [email protected] http://mats.imk.fraunhofer.de/mailman/listinfo/pykde
