4

在 Windows 上 setRange(0, 0) 时如何在 QProgressBar 中间放置文本(不仅仅是数字)?

以下是一个 PyQt 示例,它仍然无法按预期工作。

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class MainWindow(QMainWindow):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.resize(800, 600)

#        self.lb=QLabel('finding resource   ')

        self.pb = QProgressBar()
        self.pb.setRange(0, 0)

        self.pb.setAlignment(Qt.AlignCenter)
        self.pb.setFormat('finding resource...')
        self.pb.setStyleSheet("text-align: center;")

#        self.pb.setTextVisible(False)


        self.statusBar().setSizeGripEnabled(False)
#        print(self.statusBar().layout() )
        self.statusBar().setStyleSheet("QStatusBar::item {border: none;}")
        self.statusBar().addPermanentWidget(self.pb, 1)


if __name__ == "__main__":
    app = QApplication(sys.argv)

    ui = MainWindow()
    ui.show()
    sys.exit(app.exec_())
4

2 回答 2

5

vahancho 在他的回答中很好地解释了原因,并提到要覆盖QProgressBar.text()。幸运的是,这在 Python 中很简单,我知道该怎么做。

from PySide import QtGui, QtCore

class MyProgressBar(QtGui.QProgressBar):
"""
    Progress bar in busy mode with text displayed at the center.
"""

    def __init__(self):
        super().__init__()
        self.setRange(0, 0)
        self.setAlignment(QtCore.Qt.AlignCenter)
        self._text = None

    def setText(self, text):
        self._text = text

    def text(self):
        return self._text

app = QtGui.QApplication([])

p = MyProgressBar()
p.setText('finding resource...')
p.show()

app.exec_()

在此处输入图像描述

这是在 Windows 7 上。

顺便提一句。首先,我想到了蛮力方法:QStackedLayoutQLabel. QProgressBar这也应该始终有效。

于 2015-01-07T09:07:02.277 回答
2

当范围设置为 min=0 和 max=0 时,您在进度条中看不到文本的原因是该QProgressBar::text()函数在这种情况下返回一个空字符串。函数的源代码QProgressBar::text()包含以下几行:

QString QProgressBar::text() const
{
    Q_D(const QProgressBar);
    if ((d->maximum == 0 && d->minimum == 0) || d->value < d->minimum
            || (d->value == INT_MIN && d->minimum == INT_MIN))
        return QString(); // <---- an empty string on null range.
[..]

因此文本是不可见的。您可以更改行为的唯一方法是覆盖QProgressBar::text()函数,因为它被声明为虚函数。不幸的是,我不知道如何在 Python 中做到这一点。

于 2014-12-19T11:39:57.507 回答