Python:PyQt 组件QTabWidget

本文介绍了一个使用PyQt5实现的简单登录界面示例,并通过自定义流类实现了控制台输出的日志记录功能。该示例展示了如何创建登录窗口、处理登录事件以及如何重定向标准输出到GUI应用程序中的文本框。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# #coding:utf-8    
from PyQt5 import QtGui  
from PyQt5 import QtCore  
from PyQt5 import QtCore, QtGui  
from PyQt5 import uic  
from PyQt5.QtCore import *  
from PyQt5.QtGui import *  
from PyQt5.QtNetwork import *  
from PyQt5.QtWidgets import (QMessageBox,QWidget,QMainWindow,QApplication,QTabWidget,QGridLayout,QLabel,QLineEdit,QPushButton,QScrollArea,QVBoxLayout
    ,QTextEdit)
import sys,os
  
# reload(sys)  
# sys.setdefaultencoding('utf-8')  
  
class MyConsole(QWidget):  
    def __init__(self,parent):  
        QWidget.__init__(self)  
        self.parent = parent    
        self.initUI()  
          
    #初始化UI      
    def initUI(self):  
        # 网格布局
        self.gridlayout = QGridLayout()  
           
        #设置出20 x 20 的格局  ,目的是把固定空间 等分空间
        for i in range(20):  
            self.gridlayout.setColumnStretch(i,1)  
            self.gridlayout.setRowStretch(i,1)  
  
        lb1 = QLabel(u'账户:')  
        lb2 = QLabel(u'密码:')  
        self.userEntry = QLineEdit()  
        self.passEntry = QLineEdit()  
        self.passEntry.setEchoMode(QLineEdit.Password)  # 输出类型为密码类型
        self.loginBtn = QPushButton(u"登录")  
        self.loginBtn.setFixedSize(40,20) # 与resize()类似,未找到不同点
        # self.connect(self.loginBtn, QtCore.SIGNAL('clicked()'), self.onLoginButton)  
        self.loginBtn.clicked.connect(self.onLoginButton)  
          
        self.gridlayout.addWidget(lb1, 0, 0)  
        self.gridlayout.addWidget(lb2, 1, 0)  
        self.gridlayout.addWidget(self.userEntry, 0, 1,1,3)  
        self.gridlayout.addWidget(self.passEntry, 1, 1,1,3)  
        self.gridlayout.addWidget(self.loginBtn, 0, 4,1,2)  
          
        self.setLayout(self.gridlayout)     
    
    # 点击登录按钮  
    def onLoginButton(self): 
        # 获取输入内容
        username = self.userEntry.text()  
        password = self.passEntry.text()  
        try:
            QMessageBox.about(self, '提示', u"登录成功")  
        except Exception as e:
            print(e)
        print(username+u'登录成功!\n' + u"密码是:"+password+'\n------------------------') 
          
class EmittingStream(QtCore.QObject):  
        textWritten = QtCore.pyqtSignal(str)  
        def write(self, text):  
            self.textWritten.emit(str(text))  
   
class MainWindow(QMainWindow):  
    def __init__(self,parent=None):  
        QMainWindow.__init__(self, parent)  

        # 定义Tab控件
        tabs = QTabWidget(self)  
  
        # 第1个Tab页  
        # tab1 = QWidget()       
        ''''' 
        #这是不带滚动条的写法   
        vbox = QVBoxLayout() 
        console = MyConsole(self) 
        vbox.addWidget(console) 
        tab1.setLayout(vbox) 
        '''  
        #这是带滚动条的写法  
        console = MyConsole(self)  # 自定义对象,登录
        console.setMinimumSize(500, 350)  
        # 滚动条
        scroll = QScrollArea()  
        scroll.setWidget(console)  
        # scroll.setAutoFillBackground(True)  
        # scroll.setWidgetResizable(True)  
        # vbox = QVBoxLayout()  
        # vbox.addWidget(scroll)    
        # tab1.setLayout(vbox) # QWidget,需要放到布局中
        tab1 = scroll #这里可以直接将滚动条作为tab页内容
          
        # 第2个Tab页  
        self.tab2 = QTextEdit()

        # QTabWidget的2个Tab页
        tabs.addTab(tab1,u"控制台")  
        tabs.addTab(self.tab2,u"日志输出") 

        # QTabWidget的控件大小
        tabs.resize(400, 320) 
        # 主窗体的大小
        self.resize(500, 350)  
          
        #禁止最大化  
        self.setWindowFlags(Qt.WindowMinimizeButtonHint)    
        self.show()
          
        #重定向输出  (关键)
        sys.stdout = EmittingStream(textWritten=self.normalOutputWritten)  
        sys.stderr = EmittingStream(textWritten=self.normalOutputWritten)  
    
    # 当对象被删除时,会自动被调用
    def __del__(self):  
        sys.stdout = sys.__stdout__  
        sys.stderr = sys.__stderr__  
          
    def normalOutputWritten(self, text):  
        cursor = self.tab2.textCursor()  # 光标
        cursor.movePosition(QtGui.QTextCursor.End) # 光标移至最后
        cursor.insertText(text)  # 插入文本
        self.tab2.setTextCursor(cursor)  # 使之生效
        self.tab2.ensureCursorVisible()  # 确保滚动文本编辑时光标是可视的。  
              
def main():  
    app = QApplication(sys.argv)  
    win = MainWindow()  
    sys.exit(app.exec_())  
   
if __name__ == '__main__':  
    main()  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值