# #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()
Python:PyQt 组件QTabWidget
最新推荐文章于 2025-07-02 14:41:13 发布