在 PyQt 中,通常使用登录对话框作为应用程序的入口。为了提高用户体验,可以在登录对话框出现之前显示一个启动画面,用于显示应用程序的徽标或其他信息。
解决方案
要添加启动画面,可以使用以下步骤:
- 导入必要的模块:
import sys
import time
from PyQt4 import QtGui, QtCore
from loginD import *
from mainwindow import Ui_MainWindow
- 定义一个启动画面类:
class SplashScreen(QtGui.QSplashScreen):
def __init__(self, pixmap):
super().__init__(pixmap, QtCore.Qt.WindowStaysOnTopHint)
self.setWindowFlags(QtCore.Qt.FramelessWindowHint) # 去掉边框
self.show()
def closeEvent(self, event):
event.ignore()
self.hide()
def start(self):
QtCore.QTimer.singleShot(2000, self.close) # 2 秒后关闭启动画面
- 在应用程序的主函数中,创建启动画面并显示它:
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
splash_pix = QtGui.QPixmap('logo.png')
splash = SplashScreen(splash_pix)
splash.start()
app.processEvents() # 使应用程序处理事件
if Login().exec_() == QtGui.QDialog.Accepted:
window = Main_Window()
window.show()
sys.exit(app.exec_())
代码例子
import sys
import time
from PyQt4 import QtGui, QtCore
from loginD import *
from mainwindow import Ui_MainWindow
class SplashScreen(QtGui.QSplashScreen):
def __init__(self, pixmap):
super().__init__(pixmap, QtCore.Qt.WindowStaysOnTopHint)
self.setWindowFlags(QtCore.Qt.FramelessWindowHint) # 去掉边框
self.show()
def closeEvent(self, event):
event.ignore()
self.hide()
def start(self):
QtCore.QTimer.singleShot(2000, self.close) # 2 秒后关闭启动画面
class Login(QtGui.QDialog):
# A dialog with username and password lineedit
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.ui = Ui_LoginD()
self.ui.setupUi(self)
self.ui.PasswordLE.setEchoMode(QtGui.QLineEdit.Password)
QtCore.QObject.connect(self.ui.LoginPB, QtCore.SIGNAL('clicked()'),
self.HandleLogin)
def HandleLogin(self):
if self.ui.PasswordLE.text() == "pass":
self.accept()
else:
QtGui.QMessageBox.warning(
self, 'Error;', 'bad')
class Main_Window(QtGui.QMainWindow):
# main window ui
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
splash_pix = QtGui.QPixmap('logo.png')
splash = SplashScreen(splash_pix)
splash.start()
app.processEvents() # 使应用程序处理事件
if Login().exec_() == QtGui.QDialog.Accepted:
window = Main_Window()
window.show()
sys.exit(app.exec_())
在上面的代码中,SplashScreen 类是一个自定义的启动画面类,它继承自 QtGui.QSplashScreen 类。__init__ 方法接受一个 pixmap 参数,并将其设置为启动画面的背景图片。start 方法使用 QtCore.QTimer.singleShot 方法在 2 秒后关闭启动画面。Login 类是一个登录对话框类,它继承自 QtGui.QDialog 类。__init__ 方法设置登录对话框的界面。HandleLogin 方法处理登录逻辑。Main_Window 类是一个主窗口类,它继承自 QtGui.QMainWindow 类。__init__ 方法设置主窗口的界面。
在主函数中,首先创建了一个 SplashScreen 对象并显示它。然后,调用 app.processEvents() 方法使应用程序处理事件。接下来,调用 Login 对象的 exec_ 方法显示登录对话框。如果登录成功,则创建并显示 Main_Window 对象。