簡體   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