Pyqt 滚动条的小demo

本文介绍如何在PyQt应用程序中为包含多个界面控件的窗口添加滚动条。通过设置控件大小并利用QScrollArea组件实现滚动功能,确保用户可以查看所有内容而不受窗口尺寸限制。

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

UI有些时候界面控件较多,需要加个滚动条。恩。

核心代码:

tab1 = QtGui.QWidget()


console = MyConsole(self)
console.setMinimumSize(1500, 600) #这个要比界面设置的大!


scroll = QtGui.QScrollArea()
scroll.setWidget(console) #console是一个QWidget
scroll.setAutoFillBackground(True)
scroll.setWidgetResizable(True)


vbox = QtGui.QVBoxLayout()
vbox.addWidget(scroll)  
tab1.setLayout(vbox)

全部代码:

demo代码有点长,是因为我从Pyqt print输出到控件中这篇文章代码修改而来的,哈~

# #coding:utf-8  
from PyQt4 import QtGui
from PyQt4 import QtCore
from PyQt4.QtWebKit import*
from PyQt4 import QtCore, QtGui
from PyQt4 import uic
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
from PyQt4.QtNetwork import *
import sys

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 = QtGui.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 = QtGui.QPushButton(u"登录")
        self.loginBtn.setFixedSize(40,20)
        self.connect(self.loginBtn, QtCore.SIGNAL('clicked()'), 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()
        QtGui.QMessageBox.about(self, username+u'登录成功', u"密码是:"+password)
        #QTextCodec.setCodecForCStrings(QTextCodec.codecForName("utf-8"))
        print username+u'登录成功!\n' + u"密码是:"+password
        
        
class EmittingStream(QtCore.QObject):
        textWritten = QtCore.pyqtSignal(str)
        def write(self, text):
            self.textWritten.emit(str(text))
 
class MainWindow(QtGui.QMainWindow):
    def __init__(self,parent=None):
        QtGui.QMainWindow.__init__(self, parent)

        tabs = QtGui.QTabWidget(self)

        #tab1
        tab1 = QtGui.QWidget() 
        #这是不带滚动条的写法        
        '''
        vbox = QtGui.QVBoxLayout()
        console = MyConsole(self)
        vbox.addWidget(console)
        tab1.setLayout(vbox)
        '''
        
        #这是带滚动条的写法
        console = MyConsole(self)
        console.setMinimumSize(1500, 600)
        
        scroll = QtGui.QScrollArea()
        scroll.setWidget(console)
        scroll.setAutoFillBackground(True)
        scroll.setWidgetResizable(True)
        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(scroll)  
        tab1.setLayout(vbox)
        
        #tab2
        self.tab2 = QTextEdit()
        
        tabs.addTab(tab1,u"控制台")
        tabs.addTab(self.tab2,u"日志输出")
        
        tabs.resize(500, 350)
        self.resize(500, 350)
        
        #禁止最大化
        self.setWindowFlags(QtCore.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 = QtGui.QApplication(sys.argv)
    win = MainWindow()
    sys.exit(app.exec_())
 
if __name__ == '__main__':
    main()

效果如下:



PyQt5 中,可以使用 QScrollArea 来添加滚动条到折线图。以下是一个简单的示例,展示如何使用 PyQt5 创建一个带有滚动条的折线图: 首先,确保已安装 PyQt5 库。可以使用以下命令进行安装: ```bash pip install PyQt5 ``` 接下来,创建一个简单的折线图和滚动区域: ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QScrollArea, QLineEdit, QWidget from PyQt5.QtGui import QPainter, QPen, QColor from PyQt5.QtCore import Qt, QPoint class LineChart(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 300, 220) self.setWindowTitle('Line Chart with Scroll Area') self.show() # 创建折线图数据 data = [10, 15, 7, 10, 6, 12, 18, 21] self.line = QLineSeries() self.chart = QChart() self.chart.addSeries(self.line) self.chart.createDefaultAxes() self.chart.setRenderHint(QPainter.Antialiasing) # 创建 QScrollArea 容器并添加图表 scroll_area = QScrollArea(self) scroll_area.setWidgetResizable(True) scroll_area.setWidget(self.chart) layout = QVBoxLayout() layout.addWidget(scroll_area) self.setLayout(layout) class ScrollAreaDemo(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): chart = LineChart() scroll_area = QScrollArea(self) scroll_area.setWidgetResizable(True) scroll_area.setWidget(chart) layout = QVBoxLayout() layout.addWidget(scroll_area) self.setLayout(layout) self.show() if __name__ == '__main__': app = QApplication(sys.argv) demo = ScrollAreaDemo() sys.exit(app.exec_()) ``` 这段代码创建了一个带有滚动条的折线图。在 `LineChart` 类中,我们创建了一个简单的折线图数据,并将其添加到 `QChart` 中。然后,我们将 `QChart` 对象放入 `QScrollArea` 中,并通过布局将其添加到主窗口中。这样就创建了一个带有滚动条的折线图。滚动条将在需要放大或缩小图表时可用。 注意:这只是一个基本的示例,您可能需要根据自己的需求进行更多的定制和调整。例如,您可能需要更改折线图的颜色、样式和标签等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值