简体   繁体   中英

adding QProgress bar within QLineEdit in PyQt or PySide

Hi I want to add the QProgressBar behind the QLIneEdit, just like it is in Safari Browser or IE, So here is my starting point how can I hook the ProgressBar and MyLineEdit together so that when user is done entering the path the progress bar should show the progress while the path is opened !!!

from PyQt4 import QtGui, QtCore
import sys

class ProgressBar(QtGui.QProgressBar):
    """ docstring for ProgressBar
    """
    def __init__(self, parent=None):
        super(ProgressBar, self).__init__(parent)
        self.timer = QtCore.QBasicTimer()
        self.step = 0
        self.doAction()

    def timerEvent(self, e):

        if self.step >= 100:

            self.timer.stop()
            return

        self.step = self.step + 15
        self.setValue(self.step)

    def doAction(self):

        if self.timer.isActive():
            self.timer.stop()
        else:
            self.timer.start(100, self)




class MyLineEdit(QtGui.QLineEdit):
    """ docstring for MyLineEdit
    """
    def __init__(self, parent=None):
        super(MyLineEdit, self).__init__(parent)
        # I want to hook this bar at the backgroind of MyLineEdit
        pbar = ProgressBar()


class Example(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Example, self).__init__(parent)

        self.pbar = ProgressBar(self)
        self.editbx = MyLineEdit(self.pbar)
        newPalette = QtGui.QPalette()
        newPalette.setColor(self.editbx.backgroundRole(), QtCore.Qt.transparent)
        self.editbx.setPalette(newPalette)
        self.editbx.setText("Defaukt text set")
        self.editbx.setStyleSheet("QLineEdit { border:none;}")
        self.pbar.setStyleSheet("QProgressBar {border:none;}")

        self.initUI()

    def initUI(self):
        # self.pbar.setGeometry(30, 40, 200, 25)
        self.setGeometry(300, 300, 280, 170)
        self.setWindowTitle('QtGui.QProgressBar')
        self.show()



def main():
    app = QtGui.QApplication(sys.argv)
    win = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

I also looking forward to add a QCombobox in place of text entered so it can list the other existing folders, not the way QCompleter uses though becuase it doesnt has look of QCombobox, and I do not want to allow user to enter anything that doesnt exists.

Any help would be greatly appreciated.

I've attached an example of a QLineEdit with a progress bar behind it. It was heavily influenced by this post: http://www.qtcentre.org/threads/54758-Progress-bar-form-QLineEdit-issue

Basically you have to manage painting yourself. Unfortunately it didn't seem to work when I tried to do the same thing with a QComboBox. I would suggest posting a new question specifically about painting a progress bar on a QComboBox once you get up to it!

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

class MyLineEdit(QLineEdit):
    def __init__(self, parent=None):
        QLineEdit.__init__(self, parent)
        self.timer = QBasicTimer()
        self.step = 0
        self.doAction()

    def timerEvent(self, e):
        if self.step >= 100:
            self.timer.stop()
            return

        self.step = self.step + 10
        self.repaint()        

    def doAction(self):
        if self.timer.isActive():
            self.timer.stop()
        else:
            self.timer.start(1000, self)

    def generateGradient(self, color):
        gradient = QLinearGradient(0, 0, 0, self.height());
        m_defaultBaseColor = self.palette().color(QPalette.Base)
        gradient.setColorAt(0, m_defaultBaseColor)
        gradient.setColorAt(0.15, color.lighter(120))
        gradient.setColorAt(0.5, color)
        gradient.setColorAt(0.85, color.lighter(120))
        gradient.setColorAt(1, m_defaultBaseColor)
        return gradient

    def paintEvent(self, event):
        p = QPainter(self)
        panel = QStyleOptionFrameV2()
        self.initStyleOption(panel)
        self.style().drawPrimitive(QStyle.PE_PanelLineEdit, panel, p, self)

        # an alternative to painting the QLineEdit is to do it only when the widget has focus and the progress bar is finished
        #if self.hasFocus() or self.step >= 100: QLineEdit.paintEvent(self, event)

        # however I've chosen to paint it always
        QLineEdit.paintEvent(self, event)

        painter = QPainter(self)
        lenap = QStyleOptionFrameV2()
        self.initStyleOption(lenap)
        backgroundRect = self.style().subElementRect(QStyle.SE_LineEditContents, lenap, self)

        # some alternative if statements you might like to use instead...
        #
        # if not self.hasFocus() and self.step < 100:
        # if self.step < 100:
        if True:
            loadingColor = QColor(116,192,250)
            painter.setBrush(self.generateGradient(loadingColor))
            painter.setPen(Qt.transparent)
            mid = int(backgroundRect.width()/100.0*self.step)
            progressRect = QRect(backgroundRect.x(), backgroundRect.y(), mid, backgroundRect.height())
            painter.drawRect(progressRect)

            painter.setPen(Qt.SolidLine)
            painter.drawText(backgroundRect, Qt.AlignLeft|Qt.AlignVCenter, " " + self.text())


class Window(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self._control = QWidget()
        self.setCentralWidget(self._control)

        l = QVBoxLayout(self._control)
        e = MyLineEdit()
        l.addWidget(e)
        b = QPushButton('a')
        l.addWidget(b)

        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Window()
    sys.exit(app.exec_())

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM