繁体   English   中英

在PyQt或PySide中的QLineEdit中添加QProgress栏

[英]adding QProgress bar within QLineEdit in PyQt or PySide

嗨我想在QLIneEdit后添加QProgressBar,就像它在Safari浏览器或IE中一样,所以这是我的起点如何将ProgressBar和MyLineEdit挂钩在一起,这样当用户完成进入路径时,进度条应显示路径打开时的进度!!!

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()

我也期待添加一个QCombobox来代替输入的文本,这样它就可以列出其他现有的文件夹,而不是QCompleter使用的方式,虽然它看起来不像QCombobox,我不想让用户输入任何不存在的东西。

任何帮助将不胜感激。

我附上了一个QLineEdit示例,后面有一个进度条。 受到这篇文章的影响很大: http//www.qtcentre.org/threads/54758-Progress-bar-form-QLineEdit-issue

基本上你必须自己管理绘画。 不幸的是,当我尝试用QComboBox做同样的事情时似乎没有用。 我建议你在QComboBox上专门写一个关于绘制进度条的新问题!

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_())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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