PyQt 4:使标签可滚动

时间:2013-06-17 06:32:33

标签: python pyqt pyqt4 qt-designer qscrollarea

我正在尝试创建一个标签,我可以在其中编写程序的当前状态 - 例如:

“阅读数据......”

“处理数据......”

“完成”。

如果文本到达标签的底部,那么它应该自动滚动文本,以确保它显示最新消息(就像控制台窗口一样)。我一直在摆弄标签和卷轴超过一个小时......但无济于事。我尝试将我的标签放在一个scrollarea(这似乎是这里建议的相关答案) - 这段代码是从Qt Designer生成的:

class Ui_Dialog(object):
def setupUi(self, Dialog):
    Dialog.setObjectName(_fromUtf8("Dialog"))
    Dialog.resize(218, 137)
    self.frame = QtGui.QFrame(Dialog)
    self.frame.setGeometry(QtCore.QRect(209, 399, 161, 111))
    self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
    self.frame.setFrameShadow(QtGui.QFrame.Raised)
    self.frame.setObjectName(_fromUtf8("frame"))
    self.scrollArea = QtGui.QScrollArea(Dialog)
    self.scrollArea.setGeometry(QtCore.QRect(10, 10, 201, 121))
    self.scrollArea.setWidgetResizable(True)
    self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
    self.scrollAreaWidgetContents = QtGui.QWidget()
    self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 199, 119))
    self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents"))
    self.label = QtGui.QLabel(self.scrollAreaWidgetContents)
    self.label.setGeometry(QtCore.QRect(15, 10, 151, 101))
    self.label.setWordWrap(True)
    self.label.setObjectName(_fromUtf8("label"))
    self.scrollArea.setWidget(self.scrollAreaWidgetContents)

    self.retranslateUi(Dialog)
    QtCore.QMetaObject.connectSlotsByName(Dialog)

我的主.pyw文件包含:

import sys
from gui_test import *

class MyForm(QtGui.QDialog):

    def __init__(self,parent=None):

        QtGui.QWidget.__init__(self,parent)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)

        self.ui.label.setText("Warning: When passing a QString to the constructor or calling setText(), make sure to sanitize your input, as QLabel tries to guess whether it displays the text as plain text or as rich text, a subset of HTML 4 markup. You may want to call setTextFormat() explicitly, e.g. in case you expect the text to be in plain format but cannot control the text source (for instance when displaying data loaded from the Web).")

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = MyForm()
    myapp.show()
    sys.exit(app.exec_())

即使并非所有文本都显示,但scrollarea并不提供任何滚动条。如果我强制滚动条始终打开,它们会变灰,表示它不会认为有任何要滚动的文本。

如果有人能帮助我,我真的很感激。

1 个答案:

答案 0 :(得分:12)

解决方案1:代码

我发现如果我改变(在Ui_Dialog中)我可以让它“工作”:

self.scrollArea.setWidget(self.scrollAreaWidgetContents)

self.scrollArea.setWidget(self.label)

我不知道为什么QtDesigner会创建不起作用的代码,而且我还没有完全理解为什么代码不能正常工作呢。 self.label将self.scrollAreaWidgetContents作为其父级,因此连接似乎就在那里。

因此,我猜测我在QtDesigner中做错了什么,这阻止了它导出有效的代码。

解决方案2:在QT DESIGNER中

好的,所以我发现如果我执行以下操作,我可以通过QtDesigner工作:

(1)创建ScrollArea [此时无法设置ScrollArea的布局]

(2)在ScrollArea中放置一个标签

(3)右键单击ScrollArea,设置其布局(例如,水平布局)

(4)出口

这似乎工作得很好。但是,如果我执行以下操作,则无效:

(1)创建ScrollArea

(2)在ScrollArea中放置一个布局(例如,水平布局)

(3)在标签内放置标签

(4)出口

我不确定这里发生了什么,但是,然而,这些 解决了这个问题。