如何在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_())
答案 0 :(得分:4)
vahancho在他的answer中很好地解释了原因,并提到要覆盖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上。
顺便说一下。首先,我考虑了蛮力方法:QStackedLayout
,QLabel
位于QProgressBar
之上。这应该也一直有效。
答案 1 :(得分:1)
当范围设置为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做到这一点。